我想澄清一些关于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
抱歉这个烂摊子。
答案 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点所述。