我遇到了问题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)