如何在C语言中将一个字符/整数添加到字符数组中?

21
如何在C中将字符数组:=“Hello World”添加'.',以便我得到一个字符数组:“Hello World。”这个问题看起来很简单,但我正在努力解决。
尝试了以下内容:
char str[1024];
char tmp = '.';

strcat(str, tmp);

但是它不能正常工作。它显示了错误:"passing argument 2 of ‘strcat’ makes pointer from integer without a cast" 我知道在C语言中,字符也可以被转换为整数。我是否需要将tmp也转换为字符数组,或者有更好的解决方法?


Str中不包含字符串,只有大小声明呵呵。 - Juan Bonnett
那只是一个用“Hello World”来描述问题的例子。在我的真实程序中,它必须首先为空。程序稍后会填充它。这个问题只涉及将char/int添加到char数组中。 - missjohanna
4
@MikeCAT 错误的语言。 - emlai
5个回答

41

strcat 的声明如下:

char *strcat(char *dest, const char *src)

它期望两个字符串。虽然这段代码可以编译通过:

char str[1024] = "Hello World";
char tmp = '.';

strcat(str, tmp);

使用strcat会导致糟糕的内存问题,因为它要查找以空字符结尾的C字符串。您可以这样做:

char str[1024] = "Hello World";
char tmp[2] = ".";

strcat(str, tmp);

示例

如果你真的想要附加一个字符,你需要编写自己的函数。类似于这样:

void append(char* s, char c) {
        int len = strlen(s);
        s[len] = c;
        s[len+1] = '\0';
}

append(str, tmp)
当然,您可能还想检查您的字符串大小等以使其在内存方面更加安全。

19
我删掉了我的回答,支持你的回答,因为你解释得更好。 - Juan Bonnett
这是正确的方法。你的追加函数会完成任务。 - bruceg
3
抱歉我可能有点烦人,但我来这里是为了学习。char数组中的一个元素不是char吗?在缓存中它不是存储为char1 char2 char3...吗?为什么我不能改变其中一个元素的值? - missjohanna
strcat函数在传递的字符数组参数中查找NULL字符串吗? - xyf
@xyf 什么是 NULL 字符串?如果你指的是 "\0",那么这是一个 零长度字符串,是的,strcat 函数会通过不做任何操作来处理它。 - Fantastic Mr Fox
显示剩余4条评论

2
错误是因为您向strcat()传递了错误的参数。请查看strcat()的原型:
   char *strcat(char *dest, const char *src);

但是你将char作为第二个参数传递,显然是错误的。

使用snprintf()代替。

char str[1024] = "Hello World";
char tmp = '.';
size_t len = strlen(str);

snprintf(str + len, sizeof str - len, "%c", tmp);

作为OP所评论的:
这只是一个使用"Hello World"来描述问题的示例。在我的真实程序中,它必须首先为空。程序将稍后填充它。问题只包含向字符数组添加char/int。
在这种情况下,snprintf()可以轻松处理将整数类型附加到char缓冲区中。snprintf()的优点在于它更灵活,可以将各种类型的数据连接到char缓冲区中。
例如,要连接字符串、char和int:
char str[1024];
ch tmp = '.';
int i = 5;

// Fill str here

snprintf(str + len, sizeof str - len, "%c%d", str, tmp, i);

1
在C/C++中,字符串是以NULL字节('\0')结尾的char数组;
  • 您的字符串str未被初始化。
  • 您必须连接字符串,并且您正在尝试将单个字符(没有null字节,因此不是字符串)连接到字符串中。

代码应该像这样:

char str[1024] = "Hello World"; //this will add all characters and a NULL byte to the array
char tmp[2] = "."; //this is a string with the dot 
strcat(str, tmp);  //here you concatenate the two strings

请注意,只有在声明数组时才能将字符串文字分配给数组。
例如,以下代码是不被允许的:
char str[1024];
str = "Hello World"; //FORBIDDEN

and should be replaced with

char str[1024];
strcpy(str, "Hello World"); //here you copy "Hello World" inside the src array 

0
我认为您忘记初始化字符串“str”了:在使用strcat之前,您需要初始化该字符串。而且,您需要将tmp定义为一个字符串,而不是单个字符。尝试更改如下内容:
char str[1024]; // Only declares size
char tmp = '.';

for

char str[1024] = "Hello World";  //Now you have "Hello World" in str
char tmp[2] = ".";

0

建议替换为:

char str[1024];
char tmp = '.';

strcat(str, tmp);

使用这个:

char str[1024] = {'\0'}; // set array to initial all NUL bytes
char tmp[] = "."; // create a string for the call to strcat()

strcat(str, tmp); // 

这是我给出的问题的解决方案。但是我说过一个是char数组,另一个是char。如果只有两个char数组,那就没有问题了。在我的主程序中,我从fgetc获取一个char或int。如果我写:char tmp [2]; tmp [1] = fgetc(<file>);可能会起作用,但不确定! - missjohanna
根据您修改后的问题,您可以尝试以下代码:char newstr[strlen(str)+2] = {'\0'}; strcpy( newstr, str ); newstr[strlen(newstr)] = tmp; - user3629249

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