如何在 C 中使用 strcmp 将用户输入与文本文件进行比较?

How to compare user input with text file using strcmp in C?

我在 C 语言中比较两个相同的字符串时遇到问题。使用方法 strcmp(),在比较文本文件中的一行与用户输入时似乎出现问题。为什么 strcmp() return -1 即使用户输入与文本文件相同。

#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);

}

在您的 gets(inputUser) 之后添加:

inputUser[strlen(inputUser)-1] = '[=10=]';

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

此外,为避免分段错误,您应该将 gets(inputUser) 更改为:

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

除了第二个参数限制可以读取的数据长度外,这做同样的事情。使用 gets(),如果您输入超过 10 个字符以存储在 10 个字符的字符串中,它将出现段错误。

只需更换

  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) returns true (1) 如果 A 等于 B。否则 returns false (0);
  • strtok(A, B) returns A 没有子串 B.