在C语言中将字符转换为字符串

28

我如何在C语言中将字符转换为字符串。目前我使用的是c = fgetc(fp),它返回一个字符。但是我需要一个字符串来用于strcpy。


5
将所有字符存储在一个数组中,然后将\0作为数组的最后一个元素存储即可。 - haccks
你能具体说明一下吗?根据你的描述,你可以尝试使用类似 fscanf(pf, "%s", &buf) 的方法。 - gongzhitaao
int c; c = fgetc(fp); //从文件中逐个获取字符 我需要能够执行strcpy(buffer,c); - user1911575
为什么你需要与strcpy()一起使用它? - Heeryu
3
我对这个简单的问题引起的如此之多的流量和辩论感到惊讶。解决方案只需要两行代码。就是两行。我点赞这个问题,因为它让一群专业人士摔了一跤。 - Carey Gregory
9个回答

20

为了回答这个问题,我会尽量不引入太多其他的内容。

char str[2] = "\0"; /* gives {\0, \0} */
str[0] = fgetc(fp);

你可以在循环中使用第二行,与其他字符串操作一起使用 chars 作为字符串。


8

有很多种方法可以实现,但如果你只是想使用strcpy来进行操作,那么你可以按照以下方式进行:

...
    strcpy( ... , (char[2]) { (char) c, '\0' } );
...

(char[2]) { (char) c, '\0' }部分将从字符c临时生成一个以空字符结尾的字符串。

这样,您就可以避免为已经掌握的内容创建新变量,只要您只需要这个单字符字符串一次即可。


3
这是我所能想象到的最不清晰的复制字符串的语法方式。对于新手来说,这不是我会建议的方法。 - Carey Gregory
2
@CareyGregory 我同意这一点,但我认为我的解释简短易懂,足以让任何人都不那么难懂。 - Utkan Gezer
非常好的建议,但现在(MSVC:编译为C ++),它会出现:“C4576:括号内的类型后跟初始化列表是一种非标准的显式类型转换语法。” 在这里进行了一些解释(https://dev59.com/LZDea4cB1Zd3GeqPaFWI)。 - Laurie Stearn

7

仅使用 fgetc(fp) 然后调用 strcpy(buffer,c); 似乎不太合适。

你可以自己建立这个缓冲区:

char buffer[MAX_SIZE_OF_MY_BUFFER];

int i = 0;
char ch;
while (i < MAX_SIZE_OF_MY_BUFFER - 1 && (ch = fgetc(fp)) != EOF) {
    buffer[i++] = ch;
}
buffer[i] = '\0';  // terminating character

请注意,这取决于您读取的字符数不超过MAX_SIZE_OF_MY_BUFFER

5
我使用下面的代码将字符转换为字符串(以一个示例为例):

char c = 'A';
char str1[2] = {c , '\0'};
char str2[5] = "";
strcpy(str2,str1);

2

这里是一个工作示例:

printf("-%s-", (char[2]){'A', 0});

这将显示 -A-

2
这样的代码应该可以工作:
int i = 0;
char string[256], c;
while(i < 256 - 1 && (c = fgetc(fp) != EOF)) //Keep space for the final \0
{
    string[i++] = c;
}
string[i] = '\0';

2
最好输入 '\0' 而不是 0,因为 '\0' 明确表达了“我在这里分配终止字符”的含义。 - LihO
2
我认为C标准应该提到0而不是'\0',因为它只是被解释为0,但我猜这取决于你的编码风格。最近我做了很多字符串操作,我习惯使用0,因为写起来更快^^ - Taiki

2
//example
char character;//to be scanned
char merge[2];// this is just temporary array to merge with      
merge[0] = character;
merge[1] = '\0';
//now you have changed it into a string

这个答案是正确的,但应该避免仅提供代码的答案。请编辑并添加解释(您可以查看其他答案以了解这样的解释应该如何编写)。 - Donald Duck

1
这是一个老问题,但我认为没有一个答案真正符合OP的问题。他想要/需要做的只是这样:
char c = std::fgetc(fp);
std::strcpy(buffer, &c);

这里的关键在于,strcpy() 的第二个参数不必是 char 数组或 c 字符串。实际上,两个参数都不是 char 或 char 数组。它们都是 char 指针:
strcpy(char* dest, const char* src);
dest : 非const字符指针
它的值必须是一个可写字符数组元素的内存地址(该数组至少有一个元素)。
src : const字符指针
它的值可以是单个字符的地址,也可以是字符数组中的一个元素的地址。该数组必须包含特殊字符\0,以标记应复制的c字符串的结尾,该字符在其余元素(从src开始)中出现。

0

提醒一下,C语言中没有字符串数据类型。请使用字符数组来存储值并进行操作。将您的变量c改为字符数组,并在循环内部使用它来获取值。

char c[10];
int i=0;
while(i!=10)
{
    c[i]=fgetc(fp);
    i++;
}

另一种方法是使用指针动态分配内存并赋值。

请确保你的字符数组足够大,并在末尾添加'\0'字符,以表示字符串结束标记。 - Dhananjayan Santhanakrishnan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接