2017-04-17 90 views
1

我试图扫描字符串不寻常的行为,它需要有10与scanf函数

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; 
} 
+0

MAX_NAME_SIZE的值是多少? – chux

+0

它被评论在第一个代码块中,11 – XcammanX

+0

所以它是!在'struct student {...'之前建议'#define MAX_NAME_SIZE 11'。代码比评论更响亮。 – chux

回答

2

我在做什么错?

如果您的输入长于最大字段宽度,然后,在存在输入缓冲器中的过量的条目保持在那里在下一呼叫被读取。因此,在扫描之后,在继续进行下一个输入之前,需要清除输入缓冲区中的剩余输入。

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

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

+0

请注意,循环需要捕获该字符(在'int'!中),因此您也可以测试EOF。 EOF可能发生在换行符之前;那么你有一个无限循环。 –