我在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数组作为“avshgvdshv”。但是这个代码剩下的“dhsdhsdhsdhdh”字符串被分配给了familyName数组,这是我不想要的。
答案 0 :(得分:1)
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
)。此代码段检查输入以查看最后一个字符是否为换行符(表示长度正常)或另一个字符(表示它太长并且流中有额外数据)。
答案 1 :(得分:1)
你可以让scanf
在前10个这样的方式之后丢弃所有字符
scanf("%10s%*s", firstName);
在这种情况下,%*s
表示扫描字符串但不将其存储到变量中。请注意,在这种情况下,scanf
将停止扫描任何空白字符。如果您输入的字符串包含会导致问题的空格
答案 2 :(得分:1)
您需要清除标准输入流的内容。这可以改变这些:
scanf("%10s", firstName);
scanf("%20s", familyName);
到
scanf("%10s%*[^\n]", firstName);scanf("%*c");
scanf("%20s%*[^\n]", familyName);scanf("%*c");
%*[^\n]
会导致scanf
扫描并丢弃所有内容,直到换行符('\n'
)。 %*c
指示scanf
扫描并丢弃一个字符,在这种情况下,该字符可能是换行符。