2016-09-26 53 views
1

我在比较C中两个相同的字符串时遇到了问题。使用方法strcmp()时,比较文本文件中的一行到用户输入时似乎存在问题。为什么即使用户输入与文本文件相同,strcmp()也会返回-1。如何在C中使用strcmp将用户输入与文本文件进行比较?

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

struct Person{ 
    char fName[10]; 
    char lName[10]; 
}; 

char inputUser[10]; 

int main() 
{ 
    FILE *file; 
    int ret; 
    char data[20]; 

    file = fopen("file.txt", "r"); 
    struct Person *p1 = malloc(sizeof(struct Person)); 
    gets(inputUser); 

    strcpy(p1->fName , inputUser); 
    struct Person *p2 = malloc(sizeof(struct Person)); 

    while (fgets(data , 20 , file) != NULL){ 
     strcpy(p2->fName , data); 
     ret = strcmp(p1->fName, p2->fName); 
     printf("\t%d\t%s\t%s\n", ret , p1->fName, p2->fName); 
    } 
    fclose(file); 
    file = fopen("file.txt","a"); 
    fprintf(file, "%s\n", p1->fName); 
    fclose(file); 

} 
+2

你有没有考虑将*换行*问题阿?用'gets'和'fgets'?为什么不使用'fgets(inputUser,20,stdin)'而不是'gets(inputUser)'? – dvhh

+3

您的问题需要样本输入,预期输出和实际输出,然后才是[mcve]。 –

+1

请注意,fgets的输入结果将包括尾随换行符。如果换行符存在,则删除换行符。 – BLUEPIXY

回答

0

gets(inputUser)后补充一点:

inputUser[strlen(inputUser)-1] = '\0'; 

,将删除字符串的最后一个字符。 gets()记录用户输入的换行符(回车键)。这就是为什么strcmp()不认为它们是相同的东西,因为换行符。

此外,为避免分段错误,你应该改变gets(inputUser)到:

fgets(inputUser, sizeof(inputUser), stdin); 

这确实只是第二个参数一样的东西限制了可读取的数据的长度。使用gets()时,如果输入10个字符以存储为10个字符的字符串,则会发生分段错误。 !

+2

'inputUser [strlen(inputUser)-1] ='\ 0';'足以学习程序,但允许黑客利用用户输入空字符作为输入的第一个字符。这会导致'inputUser [(size_t)-1] ='\ 0';'这是UB,可能是一个例外。建议http://stackoverflow.com/a/28462221/2410359 – chux

+2

'fgets(inputUser,sizeof inputUser,stdin);'不是问题。 'fgets()'不需要'-1'来避免seg错误。 – chux

0

只需更换

strcpy(p2->fName , data); 
    ret = strcmp(p1->fName, p2->fName); 

通过

strcpy(p2->fName , strtok(data, "\n")); 
    ret = !strcmp(p1->fName, p2->fName); 
  • STRCMP(A,B)返回true(1)如果A等于B.否则返回false(0);
  • 的strtok(A,B)返回无子B.
相关问题