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';