关于C ++的cstring的一堆问题

时间:2014-12-14 01:46:20

标签: c++ arrays cstring null-terminated

我想澄清一些关于cstrings的问题:

1)初始化: 在声明如下字符数组时,C ++会自动将其定义为cstring吗?或者(我相信)一组人物?

char a[10];

换句话说,这是一个只包含空终止符的字符数组(' \ 0')还是一个空字符数组?

2)当直接处理cstring的索引(i.e. a[i] = ch+1;)时,cstring是否会自动处理它的null终止符,或者程序员是否有责任为它留出空间并插入它?

示例代码(这是我认为正确的答案):

char a[10];
int i = 0;
cin.get(ch);

while(ch != '\n' || i < 9) {
    a[i] = ch;
    counter++;
    cin.get(ch);
}
a[i] = '\0';    //either the last index(9) 
                //or the one right after the
                //last input will be set to '\0'

3)当使用<cstring>库(如strncpy,strncat等)时,是否会处理空终止符?例如:

char myCstring[] = "I am a cstring";  //size of 15 (including '\0' at i == 14)
strncpy(myCstring, "I am NOT a string object", 14);

这会导致以下数组吗?

| I |   | a | m |   | N | O | T |   | a |   | s | t | r | '\0' |
  0   1   2   3   4   5   6   7   8   9  10  11  12   13   14

最后:

char myCstring[] = "I am a cstring";  //size of 15 (including '\0' at i == 14)
strncpy(myCstring, "I'ma cstring", 14);

这会导致以下数组吗?

| I | ' | m | a |   | c | s | t | r  | i | n | g | '\0' |x|x|
  0   1   2   3   4   5   6   7   8    9   10  11   12  13 14

抱歉这个烂摊子。

1 个答案:

答案 0 :(得分:1)

1)它是chars的数组,通常是8位整数。

2)不,它被视为一个数组 - 一切都与整数数组完全相同。

3)许多人认为strncpy不安全 - 它会添加一个&#39; \ 0&#39;字符串末尾的字符,但不是字符串被截断时,与您的情况类似。生成的数组看起来像这样:

| I |   | a | m |   | N | O | T |   | a |   | s | t | r | '\0' |
  0   1   2   3   4   5   6   7   8   9  10  11  12   13   14

尾随&#39; \ 0&#39;如果你传递15大小,那就不会存在,只是因为函数被告知数组已经结束了1个字符短。如果您将sizeof(myCstring)作为大小传递,则输出将不同:

| I |   | a | m |   | N | O | T |   | a |   | s | t | r | i |
  0   1   2   3   4   5   6   7   8   9  10  11  12   13  14

请注意缺少尾随&#39; \ 0&#39;当你尝试读取字符串时会导致分段错误(但在某些情况下不必进行调试)。

4)是的,如第3点所述。