C 需要放入有限长度字符串的函数不';工作不好

C 需要放入有限长度字符串的函数不';工作不好,c,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) - remai

我创建了一个函数:

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'个字符,如果不是,请用户再次执行, 我的问题是:

当我用WORD_MAX 3测试它时,试着写一个6个字符长的字符串,它工作得很好,但当我试着写一个非常长的字符串,例如20个字符长的字符串时,它只写了部分单词,结尾有一些奇怪的ascii笑脸,“剩余”变量包含我要求函数输入的字数,得到一些垃圾值,它破坏了整个程序,为什么这样做


谢谢大家!

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

fgets(word, WORD_MAX+1, stdin);
从其

char*fgets(char*s、int大小、文件*流)
fgets()在处读取 大多数文件小于流中的字符大小,并将其存储到 s指向的缓冲区


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

fgets(word, WORD_MAX+1, stdin);
从其

char*fgets(char*s、int大小、文件*流)
fgets()在处读取 大多数文件小于流中的字符大小,并将其存储到 s指向的缓冲区


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

fgets(word, WORD_MAX+1, stdin);
从其

char*fgets(char*s、int大小、文件*流)
fgets()在处读取 大多数文件小于流中的字符大小,并将其存储到 s指向的缓冲区


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

fgets(word, WORD_MAX+1, stdin);
从其

char*fgets(char*s、int大小、文件*流)
fgets()在处读取 大多数文件小于流中的字符大小,并将其存储到 s指向的缓冲区


使用正常的gets函数无法防止溢出?不,使用
gets
无法防止溢出<流
stdin
的code>fgets相当于
gets
,只是没有溢出漏洞。@argamanza您不能为
gets
指定读取大小。它最多读取一个换行符或直到文件结束,因此缓冲区溢出几乎是不可预防的。使用正常的gets函数无法防止它?不,使用
gets
无法防止溢出<流
stdin
的code>fgets相当于
gets
,只是没有溢出漏洞。@argamanza您不能为
gets
指定读取大小。它最多读取一个换行符或直到文件结束,因此缓冲区溢出几乎是不可预防的。使用正常的gets函数无法防止它?不,使用
gets
无法防止溢出<流
stdin
的code>fgets相当于
gets
,只是没有溢出漏洞。@argamanza您不能为
gets
指定读取大小。它最多读取一个换行符或直到文件结束,因此缓冲区溢出几乎是不可预防的。使用正常的gets函数无法防止它?不,使用
gets
无法防止溢出<流
stdin
的code>fgets相当于
gets
,只是没有溢出漏洞。@argamanza您不能为
gets
指定读取大小。它读取到一个换行符或文件末尾,所以缓冲区溢出几乎是不可预防的。