我可以在C ++中使用这个C风格的字符串获得一些帮助吗?

时间:2011-10-08 23:51:03

标签: c++

我正在尝试了解未托管代码。我来自C#的背景,我正在玩C ++。

为什么这个代码:

#include <iostream>

using namespace std;

int main()
{
    char s[] = "sizeme";

    cout << sizeof(s);

    int i = 0;
    while(i<sizeof(s))
    {
        cout<<"\nindex "<<i<<":"<<s[i];
        i++;
    }
    return 0;
}

打印出来:

7
index 0:s
index 1:i
index 2:z
index 3:e
index 4:m
index 5:e
index 6:

????

不应该sizeof()返回6?

4 个答案:

答案 0 :(得分:15)

C strings是“nul-terminated”,这意味着在结尾处有一个值为0x00的附加字节。当您调用sizeof(s)时,您将获得整个缓冲区的大小,包括 nul终结符。当您致电strlen(s)时,您将获得缓冲区中包含的字符串的长度,不包括nul。

请注意,如果您修改s的内容并将nul终结符放在除结尾之外的某个位置,那么sizeof(s)仍然是7(因为这是{{1}的静态属性声明)但s可能会少一些(因为它是在运行时计算的)。

答案 1 :(得分:3)

不,C中的所有字符串都以空字符(ascii 0)终止。所以s实际上是7个字节

s i z e m e \0

答案 2 :(得分:2)

这是因为C字符串包含值0(或'\0')作为标记字符串结尾的最后一个字符。

答案 3 :(得分:2)

s是7个字节,6表示字符串,1表示空终止。