const char* a;
如何确保字符串'a'为空终止?当a =“abcd”并且我做sizeof(a)时,我得到4.这是否意味着它不是以null结尾?如果是的话,我会得到5?
答案 0 :(得分:30)
sizeof(a)
为您指定指针的大小,而不是指针指向的字符数组。就像你说过sizeof(char*)
一样。
您需要使用strlen()
来计算以null结尾的字符串的长度(请注意,返回的长度不包含空终止符,因此strlen("abcd")
为4 ,而不是5)。或者,您可以使用字符串文字初始化数组:
char a[] = "abcd";
size_t sizeof_a = sizeof(a); // sizeof_a is 5, because 'a' is an array not a pointer
字符串文字"abcd"
以空值终止;所有字符串文字都以null结尾。
答案 1 :(得分:12)
你得到4
,因为这是你系统上指针的大小。如果你想得到一个以nul结尾的字符串的长度,你需要C标准库中的strlen
函数。
答案 2 :(得分:6)
这里的问题是你混淆sizeof()
这是一个编译时操作,其字符串的长度是一个运行时操作。运行sizeof(a)
时返回4的原因是a
是一个指针,C中指针的典型大小是4个字节。为了获得字符串的长度,请使用strlen
。
对于第二个问题,如何确保字符串为空终止。明确地这样做的唯一方法是null自己终止字符串。只给出char*
,没有办法100%保证它被正确地终止。必须非常小心,以确保char*
的生产者和消费者之间的合同被理解为谁终止了字符串。
答案 3 :(得分:5)
如果您交给一个char数组,其中可能有也可能没有以null结尾的数据,那么确实没有好的方法可以检查。你能做的最好的事情就是搜索一个空符号,直到指定一个指定长度(不是无限期!)。但是0并不是在未初始化的内存区域中找到的异常数据字节。
这是许多人不喜欢的C's事实字符串标准的众多内容之一。找到客户端给你的字符串长度最好是O(n)搜索操作,最坏的情况是分段错误。
另一个问题当然是数组和指针是可互换的。这意味着array_name + 2
与&(array_name[2])
相同,sizeof(a)
为sizeof(char*)
,而不是数组的长度。
答案 4 :(得分:4)
sizeof(a)
是sizeof(const char*)
,指针的大小。它不受a
内容的影响。为此,您需要strlen
。
此外,所有双引号字符串文字(如源代码中的"abcd"
)都会自动以空值终止。
答案 5 :(得分:1)
sizeof(a)返回const char *a
的大小...而不是它所指向的大小。您可以使用strlen(a)
来解释以null结尾的字符串的长度,不,strlen的结果不包括空终止符。