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

标签 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 array 作为 "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 结尾)。此代码片段检查输入以查看最后一个字符是换行符(表示长度正常)还是另一个字符(表示它太长并且流中有额外数据)。

关于接受输入的 Char 数组将剩余数据放入连续的 char 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33186995/

相关文章:

C 中图的连通分量

c - 在 scanf() 中单独输入?

c - 在 C 中将 1 个字符串复制到另一个字符串时出错

c - USB 描述符的 ID_SERIAL 和 ID_SERIAL_SHORT udev 属性有什么区别

c - 为什么 char *str = "anything"的大小总是 8?

C编程sprinf问题

c++ - 将日期成员存储在不同的变量中

c - 在 C 中动态读取用户输入字符串

改变缓冲区溢出函数的返回值

c - 在使用 eof 获取特定输入值时在 c 中获得无限循环