使用c字符串连接和双大小?

使用c字符串连接和双大小?,c,C,我正在学习C,我需要处理一些C字符串。我对C语言非常不满意,特别是在释放内存方面,所以如果我的问题是错的,请告诉我 我有一个空的c字符串,比如说大小5,我想在它后面加一个字符,一次加一个字符。所以,对于前9个字符,一切都很好,但一旦超过9个,就需要扩展数组的大小来存储字符。所以我认为最简单的方法是使用strcat,比如: char orig[] = "hello"; char temp[1]; temp[0] = ' '; strcat(orig, temp); temp[0] = 'w'; s

我正在学习C,我需要处理一些C字符串。我对C语言非常不满意,特别是在释放内存方面,所以如果我的问题是错的,请告诉我

我有一个空的c字符串,比如说大小5,我想在它后面加一个字符,一次加一个字符。所以,对于前9个字符,一切都很好,但一旦超过9个,就需要扩展数组的大小来存储字符。所以我认为最简单的方法是使用strcat,比如:

char orig[] = "hello";
char temp[1];
temp[0] = ' ';
strcat(orig, temp);
temp[0] = 'w';
strcat(orig, temp);
// etc

当我执行printf(orig)时,字符串输出了我期望的结果,但我很担心,因为我没有扩展orig的大小,因为
printf(“%d”,sizeof(orig))
仍然是5,但由于添加了temp,应该会更大。解决此问题的最佳(最简单)方法是什么?

由于原始文件是静态分配的,因此您无法释放和重新分配它。但您可以预先分配更多空间以容纳其他字符,如下所示:

char orig[100] = "hello";

请注意,
sizeof(orig)
将从100开始,并保持在100,无论其中的字符串长度如何。要找出其中C字符串的当前长度,请使用
strlen(orig)
明确指定
orig
的大小;具有足够满足您需求的大(ish)值

char orig[1000] = "hello";
最好的方法是使用指针,在
malloc()
realloc()
free()
的帮助下,使用足够的内存来保存数据。但是要做的工作要多得多。

您需要为字符串分配(并释放)内存。 此外,在代码中没有大小为4的空C字符串。同样对于strcat,您需要目的地有足够的空间来容纳这两个字符串,而您刚刚分配了一个固定的6个字符(hello加上一个用于尾部\0)

所以最好将代码编写为

char const orig[] = "hello";  // The right hand side is not going to be changed so make the variable const
char * result = malloc( strlen(orig) + 3 );  // 3 is one for each of the letters and one for the trailing \0
strcpy( result, orig ); // copies all of orig and the trailing \0

strcat(result, " ");  
strcat(result, "w");

// extra work

free( result );

orig的大小为6。数组中的最后一个位置(
orig[5]
)有一个NUL终止字节永远不能是可用的字符串。要成为一个字符串,它需要一个NUL终止字节,但它只有一个字节的空间,所以它只能是空字符串。它只是维护一个动态数组
char
s。但(试图)改变它们是未定义的行为。同时,数据也被复制到源文件中;让指针指向常量字符是个好主意:
constchar*ptr=“readonly”