gpt4 book ai didi

c++ - 该程序为 name[i] 提供垃圾值,i= 1 到 3

转载 作者:行者123 更新时间:2023-11-28 04:20:06 25 4
gpt4 key购买 nike

我是编程初学者。我正在构建一个程序来读取单个字符串,将其存储在不同的数组中并打印它们。但是输出为 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com