首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >*以双“0”结尾的字符

问*以双“0”结尾的字符
EN

Stack Overflow用户
提问于 2017-06-09 14:42:44
回答 3查看 311关注 0票数 2

我的代码正在崩溃,因为在某些字符串的末尾缺少char '\0‘。

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-06-09 15:18:45

在字符串的末尾使用这个char ('\0')两次有问题吗?

这个问题不够清晰,因为“字符串”对人们来说意味着不同的东西。

让我们使用C规范定义,因为这是一个C帖子。

字符串是由第一个空字符结束并包含的连续字符序列。C11§7.1.1 1

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

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

试图向字符串中添加空字符的问题是混淆。str...()函数与上面定义的C字符串一起工作。

代码语言:javascript
复制
// 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'。

票数 5
EN

Stack Overflow用户

发布于 2017-06-09 15:07:31

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

你会把它加在哪里?假设我们做了这样的事情:

代码语言:javascript
复制
char *p = malloc(32);

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

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

可能最好是修复构建字符串的位置,以便正确地执行该操作。

票数 3
EN

Stack Overflow用户

发布于 2017-06-09 14:46:57

拥有'\0'不是一个问题,除非您还没有超出这个char数组的范围。

您必须理解,拥有两次'\0'将意味着任何字符串操作都不会知道存在第二个'\0'。他们只会读到第一个'\0',并与它在一起。对于他们来说,第一个'\0'是空终止字符,在那之后不应该有任何东西。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44460652

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档