我正在为c类介绍做一个作业,所以我的知识仍然很少,请你好。我有
scanf(" %20s", contact.name");
printf("Do you want to enter a middle name?");
scanf(" %c", doYouWant");
如果第一个scanf超过20个字符,则字符将成为下一个scanf的输入。如果我使用%s然后它将接受整行,但将比分配的内存更长。
我需要在我的结构中获得第一个输入和存储然后询问下一个问题。如何正确避免将字符21+用作下一个问题的输入,同时将其限制为20个字符。
答案 0 :(得分:2)
您可以使用fgets
读取完整的行(可能比您接受的名称的长度长),将其截断为适当的长度并将其复制到目的地:
int main(){
char buffer[500];
if (fgets(buffer,500,stdin)) { // reads in a line including newline character
buffer[20]='\0'; // truncate to at most 20 characters (note: requires an array/memory of length 21)
buffer[strcspn(buffer, "\n")]='\0'; // cut of the newline character (if any)
strcpy(contact.name, buffer);
printf("Do you want to enter a middle name?");
scanf(" %c", &doYouWant);
// ...
}
}
" %c"
中的空白是必要的,如果您愿意接受" ý"作为输入;但请注意,新行已被fgets
...
答案 1 :(得分:1)
如果你想删除scanf
没有消耗的额外输入,一种方法是使用循环读取和丢弃额外的输入,如下所示:
scanf(" %20s", contact.name);
int c;
while((c = getchar()) != '\n' && c != EOF) // <=== This loop read the extra input characters and discard them
/* discard the character */;
printf("Do you want to enter a middle name?");
.....
.....
循环体是空的;我们不会对我们正在阅读的角色采取任何措施,因此将其丢弃。
答案 2 :(得分:0)
一小时无法获得,但我现在拥有它。
scanf(" %30s%*s", name.firstName);
如果我理解正确的话,%* s吞下(发送到我猜的位桶)额外的字符。