关于C++的束缚的一堆问题

A bunch of questions about C++'s cstring

本文关键字:一堆 问题 C++ 束缚 关于      更新时间:2023-10-16

关于 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] = '';    //either the last index(9) 
                //or the one right after the
                //last input will be set to ''

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

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

这会导致以下数组吗?

| I |   | a | m |   | N | O | T |   | a |   | s | t | r | '' |
  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 '' at i == 14)
strncpy(myCstring, "I'ma cstring", 14);

这会导致以下数组吗?

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

对不起,弄得一团糟。

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

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

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

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

但是,如果您传递了大小的15,则尾随的"\0"将不存在,它之所以存在,只是因为函数被告知数组已短 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

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

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