scanf的异常行为

时间:2017-04-17 11:41:28

标签: c arrays string scanf

我正在尝试扫描字符串,它的最大长度需要为10.

struct Person{
        char name[MAX];
        float score;
        date_t dafe;
    };

//MAX = 11

我正在使用一个菜单,当输入的字符串少于10个字符时,它工作正常,但是当字符串较长时,它会遍历菜单并将其余字符串(任何超过10个字符)存储在名称值中阵列中的下一个学生(创建一个新学生)。我究竟做错了什么?这是用scanf限制字符串的正确方法吗?

while(choice != 6){
    printMenu();
    scanf("%d", &choice);
    switch(choice){
        case 1 : 
            if(Size < MAX){
                printf("Adding Person \n");
                personList[Size] = addPerson();
                Size++;
            }else{
                printf("Reached maximum size \n");
            }
            break;
        case 2 : //Other Options


Person_t addperson(void){
    person_t tempperson;

    printf("Enter name> \n");
    scanf("%10s", tempPerson.name);
    printf("Enter date: day> \n");
    scanf("%d", &person.date.day);
    //more values

    return tempPerson;
}

1 个答案:

答案 0 :(得分:2)

  

我做错了什么?

如果您的输入长于最大字段宽度,则输入缓冲区中存在的多余条目将保留在下一次调用中。因此,在扫描之后,您需要在继续进行下一次输入之前清除剩余输入的输入缓冲区。

实现这一目标的粗略方法是while ('\n' != getchar());,但是对于输入为&lt; = 10个字符的情况,您将遇到问题。

更好的方法是使用fgets()阅读整行,然后使用sscanf()读入您需要的确切输入。