strcat(dest," \ something") - 不显示反斜杠

时间:2017-07-30 14:28:13

标签: c backslash string-literals

我遇到了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;
}

3 个答案:

答案 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。
  • 在C中,不需要转换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,如\"\'将被解释为",分别为'。要在字符串常量中包含\,您应该将其转义为\\

  • 您使用testdest连接到strcat(dest, test);,但dest指向由malloc()分配的未初始化的内存块。您应该使用strcpy()。请注意,您可以使用POSIX函数strdup()(如果您的系统可用)。

不太重要,但值得考虑:

  • 无需在C中转换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;
}