C FGET被忽略,将值传递到结构数组时出现问题

C FGET被忽略,将值传递到结构数组时出现问题,c,C,我试图创建一个函数,该函数读取一个人的个人详细信息,并通过一个结构将数据传递给调用函数,然后返回返回的姓名数 #include <stdio.h> #include <string.h> #define MAX 100 int readin(Employee *emp); int main() { Employee emp[MAX]; int size; size = readin(emp); return 0; } int readin(Employee

我试图创建一个函数,该函数读取一个人的个人详细信息,并通过一个结构将数据传递给调用函数,然后返回返回的姓名数

#include <stdio.h>
#include <string.h>
#define MAX 100
int readin(Employee *emp);
int main()
{
  Employee emp[MAX];
  int size;
  size = readin(emp);
  return 0;
}
int readin(Employee *emp)
{
  char name[40], tel[40], *p;
  int id,size=0,i=0;
  double sal;
  printf("Enter name:\n");
  scanf("\n");
  fgets(name,40,stdin);
  if (p=strchr(name,'\n')) *p = '\0';
  if (strcmp("#",name) != 0) {
    while (strcmp("#",name) != 0) {
      strcpy(emp->name, name);
      printf("Enter tel:\n");
      fgets(tel,40,stdin);
      if (p=strchr(tel,'\n')) *p = '\0';
      strcpy(emp->telno, tel);
      printf("Enter id:\n");
      scanf("%d",id);
      emp->id = id;
      printf("Enter salary:\n");
      scanf("%f",sal);
      emp->salary = sal;
      size++;
      i++;
      printf("Enter name:\n");
      fgets(name,40,stdin);
    }
  }
  return size;
}
但是,当我执行程序时,名称的第一个fgets将被忽略,即使我输入#,循环也不会停止,这应该表示终止。 任何帮助都将不胜感激。

如果(p=strchr(名称,'\n'))*p='\0';
在这里,您可以正确地去掉输入末尾的换行符。但是,您只能在循环之前执行此操作。因此,当有人输入超过初始输入的
时,尾随的换行符不会被删除,也永远不会等于
。您还应该在循环结束时修剪它:

//循环的最后4行
大小++;
i++;
printf(“输入名称:\n”);
fgets(名称,40,标准名称);
如果(p=strchr(名称,'\n'))*p='\0';
//环端
你也有一些不必要的东西,比如
scanf(“\n”)
if
语句围绕
while
循环(如果条件不满足,while循环就不会运行,不需要额外的if语句)。

正如wildplasser指出的那样,
\n
将添加到
名称的末尾。还有另一种方法可以从
name

printf("Enter name:\n");
fgets(name,40,stdin);
name[strcspn(name, "\n")] = '\0'; 

请参考此链接:.

while(strcmp(“#”,name)!=0){
这永远不会产生真值:fgets()保留输入字符串中的(CR)LF。可能您的环境使用
'\r'
for?也可以尝试
strchr(name,'\r')
…salary的
scanf()
将换行保留在输入缓冲区中,因此
fgets()
读取换行符后。不要混合使用
fgets()
scanf()
;使用
fgets()
获取数据,使用
sscanf()
解析
fgets()
读取的行。
printf("Enter name:\n");
fgets(name,40,stdin);
name[strcspn(name, "\n")] = '\0';