变量周围的堆栈已损坏

use*_*206 4 c gets

我遇到了问题gets.

目的是从用户那里获得输入,直到他点击'Enter'.

这是代码:

struct LinkedListNode* executeSection2()
{
    char inputArr [3] = {'\0'};
    struct LinkedListNode* newNode;
    struct  LinkedListNode* head = NULL;

    gets (inputArr);

    while (inputArr[0] != 0) // The user didn't press "Enter"
    {
        newNode=newLinkedListNode();
        newNode->tree=newHuffmanNode(inputArr[0],atoi(inputArr+2));

        head = addNode(&head, newNode);

        gets (inputArr);
    }

    head = buildHuffmanTree(&head);
    return head;
}
Run Code Online (Sandbox Code Playgroud)

似乎没问题,用户点击'Enter',代码从while出来,但在返回后,我收到错误信息:

变量'inputArr'周围的堆栈已损坏

我想我没有正确读取键盘输入.我会为一些指导感到高兴.

谢谢.

das*_*ght 11

这个错误很好地说明了为什么gets被弃用的原因:它容易出现缓冲区溢出,这会破坏堆栈或任何内存碰巧接近缓冲区的末尾.当用户输入两个以上的字符时,前三个字符放入缓冲区,其余字符进入后面的内存中,导致未定义的行为.

你需要gets用一个调用来替换调用fgets,它接受缓冲区的大小,结束时防止用户输入超越它:

fgets (inputArr, 3, stdin);
Run Code Online (Sandbox Code Playgroud)

在每次while迭代中,用户都会命中enter,最后,当他想要停止时,他只会命中enter.

fgets考虑'\n'字符串的一部分,所以当用户点击enter返回的字符串中唯一的字符时将是'\n':

while (inputArr[0] != '\n') { // The user didn't press "Enter"
    ...
}
Run Code Online (Sandbox Code Playgroud)