[英]Char array taking input putting remaining data to consecutive char array
我在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数组。
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
)。 此代码段检查输入内容,以查看最后一个字符是换行符(指示长度是确定的)还是其他字符(指示它太长并且流中有额外的数据)。
您可以用scanf
以这种方式丢弃前10个字符之后的所有字符
scanf("%10s%*s", firstName);
在这种情况下, %*s
表示扫描字符串,但不将其存储到变量中。 请注意,在这种情况下scanf
将停止对任何空白char进行扫描。 如果您输入的字符串中的空格会引起问题
您需要清除标准输入流的内容。 可以通过更改以下内容来完成:
scanf("%10s", firstName);
scanf("%20s", familyName);
至
scanf("%10s%*[^\n]", firstName);scanf("%*c");
scanf("%20s%*[^\n]", familyName);scanf("%*c");
%*[^\\n]
指示scanf
扫描并丢弃所有内容,直到换行符( '\\n'
)。 %*c
指示scanf
扫描并丢弃一个字符,在这种情况下,该字符可能是换行符。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.