*以''0'结尾的char

时间:2017-06-09 14:42:44

标签: c c-strings null-terminated nul

由于某些字符串末尾缺少char'\ 0',我的代码崩溃了。

我很清楚为什么我们必须使用这个终止字符。我的问题是, 在字符数组中添加潜在的第二个空字符是否有问题 - 解决字符串问题?

我认为只需在每个字符串中添加'\ 0'而不是验证它是否需要然后添加就更便宜了,但我不知道这是否是一件好事。

3 个答案:

答案 0 :(得分:5)

  

在字符串末尾有两次char'\0')是否有问题?

这个问题缺乏明确性,因为“字符串”对人们来说意味着不同的东西 让我们使用C规范定义,因为这是一个C post。

  

string 是由第一个空字符终止并包含第一个空字符的连续字符序列。 C11§7.1.11

所以字符串,不能有2个空字符,因为字符串在到达第一个字符串时结束。 @Michael Walz

相反,重新解析为“在字符数组中添加潜在的第二个空字符是否有问题 - 解决字符串问题?”

尝试向字符串添加空字符的问题是混乱。 str...()函数使用上面定义的C字符串。

// If str1 was not a string, strcpy(str1, anything) would be undefined behavior.
strcpy(str1, "\0");  // no change to str1

char str2[] = "abc";
str2[strlen(str2)] = '\0'; // OK but only, re-assigns the \0 to a \0
// attempt to add another \0
str2[strlen(str2)+1] = '\0'; // Bad: assigning outside `str2[]` as the array is too small

char str3[10] = "abc";
str3[strlen(str3)+1] = '\0'; // OK, in this case
puts(str3);                  // Adding that \0 served no purpose

正如许多人所评论的那样,添加备用'\0'并不是直接参与代码的基本问题。 @Haris @Malcolm McLean

未发布的代码是需要解决@Yunnosch的真正问题,而不是尝试追加第二个'\0'

答案 1 :(得分:3)

  

我认为只要添加一个' \ 0'每个字符串除了验证它是否需要然后添加它,但我不知道它是否是一件好事。

你会在哪里添加它?让我们假设我们做过类似的事情:

char *p = malloc(32);

现在,如果我们知道分配的长度,我们可以将'\0'作为分配区域的最后一个字符,如p[31] = '\0'中所示。但是我们不知道字符串的内容应该有多长。如果应该只是foobar,那么仍有25个字节的垃圾,如果处理或打印,可能会导致其他问题。

更不用说如果你拥有的只是指向字符串的指针,那么很难知道分配区域的长度。

可能更好地修复构建字符串的位置以正确执行。

答案 2 :(得分:2)

'\0'不是问题,除非你没有超出那个char数组的范围。

你必须明白,如果两次'\0'意味着,任何字符串操作都不会知道还有第二个'\0'。他们只会读到第一个'\0',并与之相关。对于他们来说,第一个'\0'是Null终止字符,之后不应该有任何内容。