需要推出有限长度字符串的函数不能很好地工作

时间:2013-12-23 15:00:11

标签: c

我已经创建了这个功能:

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笑脸,以及包含我要求函数输入的单词数量的'剩余'变量获得了一些垃圾值,它会破坏整个程序,为什么会这样做呢?

谢谢!

1 个答案:

答案 0 :(得分:3)

正如您所注意到的那样,gets无法避免缓冲区溢出。作为替代方案,您可以使用fgets

fgets(word, WORD_MAX+1, stdin);

来自man page

  

char * fgets(char * s,int size,FILE * stream);
fgets()读入   大多数小于来自流的大小字符并存储它们   s指向的缓冲区。