问题描述
#include "framework.h"
#include <stdio.h>
//-----------------------------------------------------------------------------
// Computes and returns the length of a string
//
// @param text string to check
//
// @return length of the string
//
int stringLength(char *text);
//-----------------------------------------------------------------------------
// Changes a string to upper case
//
// @param text string to modify
//
void toupper(char *text);
//-----------------------------------------------------------------------------
int stringLength(char *text)
{
int string_length = 0;
while (text[string_length] != '\000')
string_length++;
return string_length;
}
// Main Function
//
int main()
{
char key[MAX_KEY_LENGTH] = {};
int string_len = 0;
do {
printf(KEY_PROMPT);
gets(key);
string_len = stringLength(key);
if (string_len <= MAX_KEY_LENGTH && string_len > 0)
{
break;
}
} while (string_len > MAX_KEY_LENGTH || string_len < 0);
}
这是我的代码。 总是在我第一次输入太长的字符串时 (例如“学生学生学生学生学生学生学生学生学生学生”) 然后是“正确的” (例如“学生”)
解决方法
为什么会出现“堆栈粉碎”?
此语句:
gets(key);
保持将越来越多的字符放入内存。所以你的输入:
Student StudentStudent StudentStudent StudentStudent StudentStudent Student
溢出输入缓冲区:key[]
结果是未定义的行为(并且可能导致seg故障事件。)如您所见,输入缓冲区key[]
的溢出破坏了堆栈。再次绕过循环并不能“神奇地”修复损坏的堆栈。
因此,请使用fgets()
而不是gets()
,因为gets()
不知道何时给fgets()
指定特定的停止点,何时停止输入更多字符。
强烈建议阅读:man fgets,以获取该功能的详细信息
,我认为您有缓冲区溢出错误。查看this answer,希望对您有所帮助。