繁体   English   中英

字符数组接受输入,将剩余数据放入连续的字符数组

[英]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数组。

  1. 您需要清除stdin (输入流)
  2. 使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM