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;
}