我有以下代码来检查常用单词字典的输入,并检查输入是否与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
答案 0 :(得分:3)
fgets()
将新行字符(如果遇到)写入正在填充的缓冲区中。在使用strcmp()
:
char* new_line = strrchr(fileString, '\n');
if (new_line) *new_line = 0;
请注意gets()
是一个危险的api,因为没有对输入进行边界检查,可能导致缓冲区溢出。读取用户输入的更安全的机制是fgets()
或scanf()
%Ns
说明符,其中N
指定要读取的最大字符数,N
必须小于数组的大小以允许空终止符:
scanf("%30s", userString);
当在文件中找到字符串时,没有理由继续从break
搜索文件的剩余部分while
以避免不必要的处理。请注意,iFound
的值永远不会在checkWordInFile()
内更改,也不会用作返回值:始终返回0
。我认为你在循环中意味着iFound = gC_FOUND;
。您还定义了宏以指示找到但未找到但不在函数中使用这些宏,但使用硬编码值。