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

标签 c++

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

相关文章:

c++ - 查找未排序数组的主导模式

c++ - 为什么我可以在私有(private)类型上使用 auto?

c++ - 如何将 libcurl 与 dev c++ 静态链接?

Raspberry Pi 1 B 上的 c++ bass 和 rapidXml

包含用户定义类型指针的 C++ vector

C++ - 类型转换错误

c++ - (C++) - 将字符串与从文件中读取的值相关联

c++ - 在 qsort() 中类型转换

c++ - boost ptime 到 unix 时间戳转换错误

c++ - 运行代码时出错