Char数组接受输入将剩余数据放入连续的char数组

时间:2015-10-17 13:08:47

标签: c

我在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数组,这是我不想要的。

3 个答案:

答案 0 :(得分:1)

  1. 您需要清除stdin(输入流)
  2. 使用fgets
  3. 多余的数据(超过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扫描并丢弃一个字符,在这种情况下,该字符可能是换行符。