我已经创建了这个功能:
void getWords(int words){
int remaining, error=0;
char word[WORD_MAX+1], def[DEF_MAX+1];
for(remaining = words;remaining > 0;remaining--){
do{
printf("Enter definition #%d out of %d:\n",((words+1) - remaining),words);
gets(word);
if(strlen(word) > WORD_MAX){
error = 1;
printf("\nError! '%s' contains %d characters | Maximum allowed: %d | Please try again...\n\n",word,strlen(word),WORD_MAX);
}
}while(error);
}
}
它基本上做了它应该做的事情,检查字符串长度是否最多为'WORD_MAX'字符,如果没有要求用户再次执行, 我的问题是:
当我用3的WORD_MAX进行测试并尝试写一个6个字符长的字符串时,它工作得很好,但是当我试着写一个很长的字符串时,例如20个字符长,它只写了一些字,用最后一些奇怪的ascii笑脸,以及包含我要求函数输入的单词数量的'剩余'变量获得了一些垃圾值,它会破坏整个程序,为什么会这样做呢?
谢谢!
答案 0 :(得分:3)
正如您所注意到的那样,gets
无法避免缓冲区溢出。作为替代方案,您可以使用fgets
fgets(word, WORD_MAX+1, stdin);
来自man page
char * fgets(char * s,int size,FILE * stream);
fgets()读入 大多数小于来自流的大小字符并存储它们 s指向的缓冲区。