由于某些字符串末尾缺少 char '\0',我的代码崩溃了。
我很清楚为什么我们必须使用这个终止字符。我的问题是,将潜在的第二个空字符添加到字符数组是否有问题 - 以解决字符串问题?
我认为在每个字符串中添加一个 '\0' 比验证它是否需要然后添加它更便宜,但我不知道这是否是一件好事。
由于某些字符串末尾缺少 char '\0',我的代码崩溃了。
我很清楚为什么我们必须使用这个终止字符。我的问题是,将潜在的第二个空字符添加到字符数组是否有问题 - 以解决字符串问题?
我认为在每个字符串中添加一个 '\0' 比验证它是否需要然后添加它更便宜,但我不知道这是否是一件好事。
在字符串末尾有两次这个
char
( )有问题吗?'\0'
这个问题缺乏明确性,因为“字符串”对人们来说意味着不同的东西。
让我们使用 C 规范定义,因为这是一篇 C 帖子。
字符串是由第一个空字符终止并包括第一个空字符的连续字符序列。C11 §7.1.1 1
因此,字符串不能有 2 个空字符,因为字符串在到达第一个字符时结束。 @迈克尔·沃尔兹
相反,重新解析为“向字符数组添加潜在的第二个空字符是否存在问题 - 以解决字符串问题?”
尝试向字符串添加空字符的问题是混淆。这些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'
并不直接解决代码的基本问题。@哈里斯@ 马尔科姆麦克莱恩
未发布的代码是需要解决@Yunnosch的真正问题,而不是尝试附加第二个'\0'
。
我认为在每个字符串中添加一个 '\0' 比验证它是否需要然后添加它更便宜,但我不知道这是否是一件好事。
你会在哪里添加它?假设我们做了这样的事情:
char *p = malloc(32);
现在,如果我们知道分配的长度,我们可以将 a'\0'
作为分配区域的最后一个字符,如p[31] = '\0'
. 但是我们不知道字符串的内容应该有多长。如果应该是 just foobar
,那么仍然会有 25 个字节的垃圾,如果处理或打印可能会导致其他问题。
更不用说如果你只有指向字符串的指针,就很难知道分配区域的长度。
可能更好地修复您构建字符串的位置以正确执行此操作。
拥有'\0'
不是问题,除非您没有超出该 char 数组的范围。
你必须明白,有'\0'
两次意味着任何字符串操作甚至都不知道有第二次'\0'
。他们会一直读到第一个'\0'
,并与它在一起。对他们来说,第一个'\0'
是 Null 终止字符,之后不应该有任何东西。