Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 字符串长度与数组长度不相同?_C_Arrays_Char_String Length_Widechar - Fatal编程技术网

C 字符串长度与数组长度不相同?

C 字符串长度与数组长度不相同?,c,arrays,char,string-length,widechar,C,Arrays,Char,String Length,Widechar,以下文本显示在第135页,共页 在上面的例子中,我认为杂碎和“c”、“h”、“o”、“p”、“s”、“u”、“e”、“y”、“0”是一样的。这是数组中的10个元素 我的问题是:为什么数组长度与本例中的字符串长度不同?11的长度是从哪里来的?wchar\u t类型是否有什么特殊的原因导致了这种情况?看起来像是一个一次关闭的错误。很可能是有人把人物算错了 chop suey是9个字符,即字符串的长度;数组大小为10,因为它需要存储标记字符串结尾的NUL终止符。正确答案如下 #include <

以下文本显示在第135页,共页

在上面的例子中,我认为杂碎和“c”、“h”、“o”、“p”、“s”、“u”、“e”、“y”、“0”是一样的。这是数组中的10个元素


我的问题是:为什么数组长度与本例中的字符串长度不同?11的长度是从哪里来的?wchar\u t类型是否有什么特殊的原因导致了这种情况?

看起来像是一个一次关闭的错误。很可能是有人把人物算错了


chop suey是9个字符,即字符串的长度;数组大小为10,因为它需要存储标记字符串结尾的NUL终止符。

正确答案如下

#include <stdio.h>
#include <wchar.h>

int main(void) 
{
    wchar_t dinner[] = L"chop suey";

    printf( "sizeof( wchar_t ) = %zu\n", sizeof( wchar_t ) );
    printf( "wcslen( dinner ) = %zu, sizeof( dinner ) = %zu\n", wcslen( dinner ), sizeof( dinner ) );

    return 0;
}
您可以使用编译器自己运行该程序

函数wcslen统计wchar\t符号的数量,直到遇到终止零为止。运算符sizeof返回字节数,包括数组占用的终止零

实际上,字符串长度是9,即从字符串长度中排除终止零。在终止零的情况下,数组中有10个wchar\u t类型的符号


类型wchar\u t的定义由实现定义。

Lchop suey是L'c',L'h',L'o',L'p',L'',L's',L'u',L'e',L'y',L'\0'。这需要一些时间来键入…C字符串的长度等于字符串开头和终止空字符之间的字符数,而数组将存储\0。这就是两者的区别+1@melpomene“我不知道。”托尼,但这就是问题所在。我们现在是10,我想知道,11是从哪里来的?我不完全理解我们是如何得到11的,因为它的类型比内存中的char大。@Tony Your自己的链接说wchar\u t通常是32位类型。另外,这是C++的,WHARGART是内置类型。重要的是将字节大小和大小区分为元素的数量,以避免混淆。这是正确的答案。我回到第134页,该页指出:字符串的长度被认为是不包括终止空字符的字符数。谢谢你,梅尔波梅!这两个都不是OP询问的数组长度。我的MSVC输出20而不是40,sizeofwchar\u t为2。@WeatherVane它是实现定义的。
#include <stdio.h>
#include <wchar.h>

int main(void) 
{
    wchar_t dinner[] = L"chop suey";

    printf( "sizeof( wchar_t ) = %zu\n", sizeof( wchar_t ) );
    printf( "wcslen( dinner ) = %zu, sizeof( dinner ) = %zu\n", wcslen( dinner ), sizeof( dinner ) );

    return 0;
}
sizeof( wchar_t ) = 4
wcslen( dinner ) = 9, sizeof( dinner ) = 40