strcat(dest, "\something") - 反斜杠不显示
strcat(dest, "\something") - backslash not showing
我在 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;
}
backslash not showing
转义:
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。
- 在 C 中,不需要像
malloc()
返回的那样转换 void
-指针,也不建议以任何方式进行转换。
那就这样吧
dest = malloc(strlen(test) + 1);
左右使代码安全以防止 dest
类型 do
的后期更改
dest = malloc((strlen(test) + 1) * sizeof *dest);
加法
正如 anatolyg in 所指出的,您在此处连接到一个未初始化的 char
数组:
strcat(dest, test);
这会调用未定义的行为,这是不好的。
要解决此问题,请执行
dest[0] = '[=24=]';
或
- 使用
calloc()
代替malloc()
到 0
-终止 dest
并以此使 char
-数组成为 C-"string",然后在将它传递给 [=18= 时使用它].
- 或者只使用
strcpy()
而不是 strcat()
。
您的代码中存在 2 个不同的问题:
您在字符串 "how \something"
中有一个不受支持的转义序列。 \
后跟 s
无法被编译器识别并被解释为 s
,就像 \"
和 \'
将被解释为 "
和'
分别。要在字符串常量中包含 \
,您应该将其转义为 \
.
您使用 strcat(dest, test);
将 test
连接到 dest
,但 dest
指向由 malloc()
分配的未初始化内存块。你应该为此使用 strcpy()
。请注意,如果您的系统可用,您可以只使用 POSIX 函数 strdup()
。
不太重要,但值得考虑:
- 不需要在 C 中转换
malloc()
的 return 值(与 C++ 不同)。
- 你应该测试
malloc()
的 return 值。
- 您应该
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;
}
正如@melepmene 在评论中提到的,"This has nothing to do with strcat
and everything with the C syntax for string literals."
为了让您理解您的代码存在的问题,我将用另一个问题来回答您的问题。
期待以下程序的输出是什么,执行程序并检查输出(显然它与您预期的不同,如果不是那么您首先没有问过这个问题地方) 然后去 google "C syntax for string literals"
int main()
{
printf("%s\n", "\how \is?");
return 0;
}
我在 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;
}
backslash not showing
转义:
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。- 在 C 中,不需要像
malloc()
返回的那样转换void
-指针,也不建议以任何方式进行转换。
那就这样吧
dest = malloc(strlen(test) + 1);
左右使代码安全以防止 dest
类型 do
dest = malloc((strlen(test) + 1) * sizeof *dest);
加法
正如 anatolyg in char
数组:
strcat(dest, test);
这会调用未定义的行为,这是不好的。
要解决此问题,请执行
dest[0] = '[=24=]';
或- 使用
calloc()
代替malloc()
到 0
-终止 dest
并以此使 char
-数组成为 C-"string",然后在将它传递给 [=18= 时使用它].
- 或者只使用
strcpy()
而不是strcat()
。
您的代码中存在 2 个不同的问题:
您在字符串
"how \something"
中有一个不受支持的转义序列。\
后跟s
无法被编译器识别并被解释为s
,就像\"
和\'
将被解释为"
和'
分别。要在字符串常量中包含\
,您应该将其转义为\
.您使用
strcat(dest, test);
将test
连接到dest
,但dest
指向由malloc()
分配的未初始化内存块。你应该为此使用strcpy()
。请注意,如果您的系统可用,您可以只使用 POSIX 函数strdup()
。
不太重要,但值得考虑:
- 不需要在 C 中转换
malloc()
的 return 值(与 C++ 不同)。 - 你应该测试
malloc()
的 return 值。 - 您应该
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;
}
正如@melepmene 在评论中提到的,"This has nothing to do with strcat
and everything with the C syntax for string literals."
为了让您理解您的代码存在的问题,我将用另一个问题来回答您的问题。
期待以下程序的输出是什么,执行程序并检查输出(显然它与您预期的不同,如果不是那么您首先没有问过这个问题地方) 然后去 google "C syntax for string literals"
int main()
{
printf("%s\n", "\how \is?");
return 0;
}