我遇到了C编程字符串连接的问题。
为什么strcat(dest, "\something")
不会将反斜杠复制到dest
?
您可能希望效仿此示例。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char *dest = "";
char *test = "how \something";
dest = (char *)malloc((strlen(test) + 1) * sizeof(char));
strcat(dest, test);
// Expect to see "how \something", but showed "how something"
printf("%s\n", dest);
free(dest);
return 0;
}
答案 0 :(得分:8)
反斜杠未显示
逃脱:
char *test = "how \\something";
编译器应该像这样警告你(GCC 4.9.2):
main.c:8:16: warning: unknown escape sequence: '\s'
char *test = "how \something";
这也与strcat()
无关。
要证明这一点
puts(test);
并收到相同的输出。
你确定吗?我期待but showed "how something"
how omething
另外
sizeof (char)
为1。void
- 例如malloc()
返回的指针,也不建议以任何方式推荐。所以就这样做
dest = malloc(strlen(test) + 1);
左右使代码安全,防止dest
类型的后期更改
dest = malloc((strlen(test) + 1) * sizeof *dest);
<强>加成强>
正如anatolyg this comment中指出的那样,你在这里连接到一个未初始化的char
数组:
strcat(dest, test);
这会调用未定义的行为,这是不好的。
要解决此问题,请执行
dest[0] = '\0';
或calloc()
代替malloc()
到0
- 终止dest
并使此char
- 数组成为C-“字符串”,然后在将其传递给strcat()
时使用它。
strcpy()
代替strcat()
。答案 1 :(得分:2)
您的代码中有两个不同的问题:
字符串"how \something"
中有一个不受支持的转义序列。编译器无法识别\
后跟s
,并将其解释为s
,如\"
和\'
将被解释为"
,分别为'
。要在字符串常量中包含\
,您应该将其转义为\\
。
您使用test
将dest
连接到strcat(dest, test);
,但dest
指向由malloc()
分配的未初始化的内存块。您应该使用strcpy()
。请注意,您可以使用POSIX函数strdup()
(如果您的系统可用)。
不太重要,但值得考虑:
malloc()
的返回值(与C ++不同)。malloc()
。const
限定指向字符串常量的指针。避免各种错误并非绝对必要但是良好的做法。sizeof(char)
的值等于1。以下是简化版本:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void) {
const char *test = "how \\something";
char *dest = malloc(strlen(test) + 1);
if (dest != NULL) {
strcpy(dest, test);
printf("%s\n", dest);
free(dest);
}
return 0;
}
答案 2 :(得分:-1)
正如@melepmene在评论中提到的那样,“这与strcat
以及字符串文字的C语法无关。”
为了让您了解代码的问题,我将用另一个问题回答您的问题。
期待以下程序的输出是什么,执行程序并检查输出(显然它与你预期的不同,如果不是那么你首先没有问过这个问题)然后去google“字符串文字的C语法”
int main()
{
printf("%s\n", "\how \is?");
return 0;
}