1

我有以下这段代码来检查输入与常用词的字典,并检查输入是否与 passHistory 文件中存储的先前输入匹配。我的问题是在 C 中比较字符串的 strcmp 方法似乎没有正确执行在我的代码中,因为如果在 passHistory 中已使用常用词或输入,则无法显示适当的错误。

一些指导将不胜感激。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>

#define MAX 30
#define gC_FOUND 99
#define gC_NOT_FOUND -99


int checkWordInFile(char * fileName,char * theWord);



int main()
{

    char userString[MAX + 1];

    int iResult;

    printf("Enter your string: ");
    gets(userString);


    printf("\n\nYou entered: %s, please wait, checking in dictionary.\n\n", userString);
    iResult = checkWordInFile("dictionary.txt",userString);




    if( iResult == gC_FOUND )
    {
        printf("\nFound your word in the dictionary");
    }
    else
    {
        printf("\nCould not find your word in the dictionary");
    }

    iResult = checkWordInFile("passHistory.txt",userString);
    if( iResult == gC_FOUND )
    {
        printf("\nPassword used");
    }
    else
    {
        printf("\nOk to use!");
    }

    printf("\n\n\n");
    system("pause");

} /* end of main */

int checkWordInFile(char * fileName,char * theWord){

    FILE * fptr;
    char fileString[MAX + 1];
    int iFound = -99;
    //open the file
    fptr = fopen(fileName, "r");
    if (fptr == NULL)
    {
        printf("\nNo dictionary file\n");
        printf("\n\n\n");
        system("pause");
        return (0); // just exit the program
    }

    /* read the contents of the file */
    while( fgets(fileString, MAX, fptr) )
    {
        if( 0 == strcmp(theWord, fileString) )
        {
            iFound = -99;
        }
    }

    fclose(fptr);

    return(0);



}//end of checkwORDiNFile
4

1 回答 1

3

fgets()如果遇到换行符,则将其写入正在填充的缓冲区中。使用前将其删除strcmp()

char* new_line = strrchr(fileString, '\n');
if (new_line) *new_line = 0;

请注意,这gets()是一个危险的 api,因为没有对输入进行边界检查,可能导致缓冲区溢出。读取用户输入的一种更安全的机制是fgets()scanf()使用说明%Ns符 whereN指定要读取的最大字符数,并且N必须比数组的大小小一以允许空终止符:

scanf("%30s", userString);

当在文件中找到字符串时,没有理由继续搜索文件的其余部分,breakwhile避免不必要的处理。请注意,iFounds 的值永远不会在 中更改,checkWordInFile()并且不用作返回值:0始终返回。我认为你的意思是iFound = gC_FOUND;在循环内。您还定义了宏来指示找到和未找到,但不要在函数中使用这些宏,而是使用硬编码值。

于 2012-11-21T19:10:25.703 回答