我在 person.h 文件中定义了一个结构
struct person{
char firstName[11];
char familyName[21];
char telephone[11];
int isStudent;
};
现在我想输入 firstName、familyName 等。
所以我做了这样的事情:
void AddRecord(struct person person[20],int currentElemetCount,int maxCount){
getFirstName(person[currentElemetCount].firstName);
getFamilyName(person[currentElemetCount].familyName);
}
在其他 commons.c 文件中我定义了这些函数,
void getFirstName(char firstName[10]){
printf("Enter First Name : ");
scanf("%10s", firstName);
}
void getFamilyName(char familyName[20]){
printf("Enter Family Name : ");
scanf("%20s", familyName);
}
但是当我执行这个程序时,在实际情况下我希望如果用户输入超过 10 个字符的名字然后简单地忽略它们。但是在这里他们被分配给 familyName 并且无法为 familyName 输入任何内容。
可能是什么原因?请帮忙。
假设输入是“avshgvdshvdhsdhsdhsdhdh”一个很长的字符串。然后我想要 firstName char array 作为 "avshgvdshv"。但是随着这段代码的保留,“dhsdhsdhsdhdh”字符串被分配给 familyName 数组,这是我不想要的。
最佳答案
- 您需要清除
stdin
(输入流) - 使用
fgets
多余的数据(超过 10 个字符)保留在输入流中,并在您下次调用 scanf
时使用。
清除stdin
int ch;
while ((ch = getchar()) != '\n' && ch != EOF);
我在自己的程序中使用的部分代码使用 fgets
获取输入并清除输入流以允许其他输入:
fgets(c, size, stdin);
if (c[strlen(c) - 1] != '\n')
int ch;
while ((ch = getchar()) != '\n' && ch != EOF);
}
fgets
函数接受输入,直到遇到换行符 (\n
) 或已读取最大可读字节数(在您的情况下为 10)。通常 fgets
给出一个以换行符结尾的字符串(char*
以 \n
结尾)。此代码片段检查输入以查看最后一个字符是换行符(表示长度正常)还是另一个字符(表示它太长并且流中有额外数据)。
关于接受输入的 Char 数组将剩余数据放入连续的 char 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33186995/