我是编程初学者。我正在构建一个程序来读取单个字符串,将其存储在不同的数组中并打印它们。但是输出为 name[0]
和 name[1]
提供了垃圾值,但为 name[2]
和 提供了正确的值名称[3]
。有什么想法吗?
char buffer[80];
cin.getline(buffer, 80, '$');
char* name[4];
name[0] = buffer;
int count = 0;
for (char* p = buffer; *p != '\0'; p++)
if (*p == '\n') {
*p = '\0';
name[++count] = p+1;
}
cout << " Your Enteries are :" << '\n';
for (int i = 0; i < count; i++)
cout << '\t' << i << ". [" << name[i] << "] " << endl;
最佳答案
您遇到数组 name
的缓冲区溢出。
如果您在输入中有(如我所料)4 \n
会发生什么?您在 if (*p == '\n')
分支内执行代码 4 次。 ++count
表达式的值是多少?由于 count
第一次被初始化为 0
,++count
计算为 1,第二次它计算为 2
,第三个到3
,第四个到4
。当您用 4 代替它时,该表达式会变成什么?
name[4] = p+1;
因此,您正在 name
数组边界的外部 编写,并在此过程中销毁堆栈中的其他变量,在您的例子中是 的开始缓冲
数组。如果您使用的是 64 位进程,您应该在 buffer
的开头期待 8 个字节的垃圾,在您的情况下恰好是 name[0]
和 的位置name[1]
指向.
当您接受用户的输入时,这始终是一个风险。 您的解决方案是在访问数组之前简单地对数组进行绑定(bind)检查:
for (char* p = buffer; *p != '\0'; p++)
if (*p == '\n') {
*p = '\0';
if (++count < 4) {
name[count] = p+1;
}
}
关于c++ - 该程序为 name[i] 提供垃圾值,i= 1 到 3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55646282/