Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
I';我用strcmp在c中挣扎_C - Fatal编程技术网

I';我用strcmp在c中挣扎

I';我用strcmp在c中挣扎,c,C,我正在努力比较用户输入和文件内容。基本上,我创建了一个更新员工详细信息的函数,该函数首先提示输入员工的姓名,然后将输入的姓名与文件中的姓名进行比较。我试着这样做: void update(EMPLOYEE *details) { FILE *file; char search; file = fopen("employees.txt","r"); if(file == NULL) { printf("File error!!!");

我正在努力比较用户输入和文件内容。基本上,我创建了一个更新员工详细信息的函数,该函数首先提示输入员工的姓名,然后将输入的姓名与文件中的姓名进行比较。我试着这样做:

void update(EMPLOYEE *details)
{
    FILE *file;
    char search;
    file = fopen("employees.txt","r");
    if(file == NULL)
    {
        printf("File error!!!");
        exit(0);
    }
    else
    {
        search = getc(file);
        printf("Enter name: ");
        scanf("%s",details->name);

        if((strcmp(search,details->name) == 0))
        {
            printf("%s\n",details->name);
            printf("%d",details->employeeNumber);
        }
    }

    fclose(file);
}

strcmp
接受一个字符串(
char*
),而不是一个字母。正如其他人在评论中提到的那样,您需要更新
getc
过程以读取多个字母。

strcmp
采用字符串(
char*
)而不是单个字母。正如其他人在评论中提到的那样,您需要更新
getc
过程以读取多个字母。

您正在将单个字符
search
与整个字符串
details->name
进行比较

签名的方法是:

你称之为:

int strcmp (const char str1, const char *str2);
不仅如此,如果您修复str1字符缓冲区使其编译,那么您将读取超过它的数据,除非它恰好是字符0,否则它不会是字符0

要解决此问题,必须执行以下操作之一:

  • 更改比较以仅查看第一个字符
  • 将搜索变量更改为字符串(可能是char[]),并读入整个字符串,然后进行比较

您正在将单个字符
搜索
与整个字符串
详细信息->名称
进行比较

签名的方法是:

你称之为:

int strcmp (const char str1, const char *str2);
不仅如此,如果您修复str1字符缓冲区使其编译,那么您将读取超过它的数据,除非它恰好是字符0,否则它不会是字符0

要解决此问题,必须执行以下操作之一:

  • 更改比较以仅查看第一个字符
  • 将搜索变量更改为字符串(可能是char[]),并读入整个字符串,然后进行比较
    • 提示:

      EMPLOYEE fileData;
      
      while ( fread( &fileData, sizeof( fileData ), 1, file ) == sizeof( fileData )
      {
      ...
      }
      
      编辑:已将读取更改为fread,因为它是一个文件*

      hth

      提示:

      EMPLOYEE fileData;
      
      while ( fread( &fileData, sizeof( fileData ), 1, file ) == sizeof( fileData )
      {
      ...
      }
      
      编辑:已将读取更改为fread,因为它是一个文件*


      hth

      您有问题吗?getc返回单个字符(字母)。您需要从文件中读取整个单词,并将其传递给strcmp。。。但是(a)你没有迭代,(b)你从哪里读取文件名(getc读取下一个字符…)和(c)你有什么实际问题…你有问题吗?getc返回一个字符(字母)。您需要从文件中读取整个单词,并将其传递给strcmp。。。但是(a)你没有迭代,(b)你从哪里读取文件名(getc读取下一个字符…)和(c)你有什么实际问题…我的问题是我想输入一个名称,然后检查名称是否在文件中。如果文件中有姓名,则应记录员工的详细信息displayed@Talra你需要把我的答案和马里奥的答案混在一起。循环遍历每个用户并将其读入。然后,以字符串形式读入用户输入(例如,
      char search[90];if(fgets(search,90,stdin)!=NULL){/*compare*/}
      ),并使用
      strcmp
      比较字符串。我的问题是,我想输入一个名称,然后检查该名称是否在文件中。如果文件中有姓名,则应记录员工的详细信息displayed@Talra你需要把我的答案和马里奥的答案混在一起。循环遍历每个用户并将其读入。然后,以字符串形式读入用户输入(例如,
      char search[90];if(fgets(search,90,stdin)!=NULL){/*compare*/}
      ),并使用
      strcmp
      比较字符串。我应该在函数本身还是在main?函数中进行比较。这将允许您读取所有记录(假设您将员工的记录写入了文件),我应该在函数本身还是在main?函数中进行读取。这将允许您读取所有记录(假设您将员工的记录写入该文件)