如何删除%20s的scanf的额外输入

时间:2018-03-13 19:51:03

标签: c string scanf

我正在为c类介绍做一个作业,所以我的知识仍然很少,请你好。我有

scanf(" %20s", contact.name");
printf("Do you want to enter a middle name?");
scanf(" %c", doYouWant");

如果第一个scanf超过20个字符,则字符将成为下一个scanf的输入。如果我使用%s然后它将接受整行,但将比分配的内存更长。

我需要在我的结构中获得第一个输入和存储然后询问下一个问题。如何正确避免将字符21+用作下一个问题的输入,同时将其限制为20个字符。

3 个答案:

答案 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吞下(发送到我猜的位桶)额外的字符。