Q我无法获得strcat工作。我试过
char *s1 = "Hello, "; char *s2 = "world!"; char *s3 = strcat(s1, s2);但我得到了奇怪的结果。
A与第 7.1 题一样,这里的主要问题在于连接结果的空间没有被正确分配。C 语言不提供自动管理的字符串类型。C 编译器只为源代码中明确提及的对象分配内存(对于字符串而言,这包括字符数组和字符串字面量)。程序员必须安排足够的空间来存放运行时操作(如字符串连接)的结果,通常通过声明数组或调用malloc.
strcat不执行分配;第二个字符串被追加到第一个字符串的末尾,原地修改。第一个(目标)字符串必须是可写的,并且有足够的空间容纳连接后的结果。因此,一种解决方法是将第一个字符串声明为一个数组
char s1[20] = "Hello, ";(在实际生产代码中,我们当然不会使用像“20”这样的魔术数字;我们会使用更健壮的机制来保证有足够的空间。)
因为strcat返回其第一个参数的值(在本例中是s1),所以变量s3在上面的问题中是多余的;在调用strcat, s1包含结果。
原始调用strcat在问题中实际上有两个问题:由指向的字符串字面量s1,除了不足以容纳任何连接的文本外,根本不一定是可写的。请参见第 1.32 题。
参考:CT&P 第 3.2 节,第 32 页