8.2 我的 strcat() 不行.我试了  char *s1 = "Hello, "; char *s2 = "world!"; char *s3 = strcat(s1, s2);  但是我得到了奇怪的结果。

跟前面的问题 7.1 一样, 这里主要的问题是没有正确地为连接 结果分配空间。C 没有提供自动管理的字符串类型。C 编译器只为源码 中明确提到的对象分配空间 (对于字符串, 这包括字符数组和串常量)。 程序员必须为字符串连接这样的运行期操作的结果分配足够的空间, 通常可以通过声明数组或调用 malloc() 完成。

strcat() 不进行任何分配; 第二个串原样不动地附加在第一个之后。 因此, 一种解决办法是把第一个串声明为数组:

    char s1[20] = "Hello, ";
由于 strcat() 返回第一个参数的值, 本例中为 s1, s3 实际上是多 余的; 在 strcat() 调用之后, s1 包含结果。

提问中的 strcat() 调用实际上有两个问题: s1 指向的字符串常数, 除了空间不足以放入连接的字符串之外, 甚至都不一定可写。 参见问题 1.13

参考资料: [CT&P, Sec. 3.2 p. 32]。

翻译朱群英、孙云, LaTeX2HTML 编译 朱群英 (2005-06-23)