-1

我有几个关于 cstrings 的问题想澄清:

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

char a[10];

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

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

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

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

对不起,混乱。

4

1 回答 1

1

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

2)不,它被视为一个数组 - 一切的工作方式与一个整数数组完全相同。

3)许多人认为strncpy不安全 - 它确实在字符串的末尾添加了一个 '\0' 字符,但在字符串被截断时不会添加,类似于您的情况。结果数组如下所示:

| 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

但是,如果您传递了大小,则尾随 '\0' 将不存在15,它存在只是因为函数被告知数组已结束 1 个字符短。如果您sizeof(myCstring)作为 size 传递,则输出会有所不同:

| 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

请注意,缺少尾随 '\0' 可能会在您尝试读取字符串时导致分段错误(但在某些情况下不必这样做,这会使调试变得更加困难)。

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

于 2014-12-14T01:53:29.290 回答