【问题标题】:How to drop extra input for scanf of %20s如何为 %20s 的 scanf 删除额外的输入
【发布时间】:2018-08-22 05:12:10
【问题描述】:

我正在做 c 类介绍的作业,所以我的知识仍然很少,请多多关照。我有

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

如果第一个 scanf 超过 20 个字符,这些字符将作为下一个 scanf 的输入。如果我使用 %s 那么它将接受整行,但会比分配的内存更长。

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

【问题讨论】:

  • 只需使用 %s 并获取他们键入的数量,然后截断为 20。
  • 如果输入太长,无论如何都无法继续。使用长度为 25 的输入字符串。scanf("%24s", inpstring); 如果输入的字符串长于20,则中止。否则strcpy(contact.name, inpstring); 注意,contact.name 结构成员应该定义为char name[21];
  • 我应该提到我们还没有学习过字符串函数,并且预计不会将它们用于此作业。这就是 in 想要做的,但被告知我不能在这里。感谢您提供的信息,至少我知道我的想法是正确的,即使我还不能使用它。使用 %20s%*s 已经成功了。
  • 不,请在您的答案下查看评论。
  • 您最大的问题将是%s 格式说明符 读取到第一个空格留下任何额外的字符,以及尾随的"\n"在输入缓冲区中。您对" %c" 的下一次调用将仅因格式字符串 中的初始空格而忽略前导空格,而不会忽略任何其他字符。您应该在下一次scanf 调用之前清空-stdin,例如for (int c = getchar(); c != '\n' && c != EOF; c = getchar()} {}

标签: c string scanf


【解决方案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?");
.....
.....

循环体为空;我们对正在阅读的字符不做任何事情,因此将它们丢弃。

【讨论】:

  • 完美运行。如此简单有效。谢谢
  • 注意" %20s"中的空格是不需要的。
【解决方案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" 中的空白是必要的,如果您也想接受“y”作为输入;但是请注意,新行已被 fgets...

【讨论】:

  • 混合fgets()scanf(" %c"...) 会导致麻烦。也许不是简单的代码,但总的来说。最好只使用fgets() 进行用户输入。
【解决方案3】:

一个小时都买不到,但我现在有了。

scanf(" %30s%*s", name.firstName);

如果我理解正确, %*s 会吞下(发送到我猜的比特桶)多余的字符。

【讨论】:

  • 但是如果没有多余的字符呢?它坐着等待。
  • 我在测试超过 31 个字符时遇到了困难,忘记测试更少。你是对的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-23
  • 2015-08-03
  • 2021-02-06
  • 2015-01-16
  • 2010-10-23
  • 2014-01-13
相关资源
最近更新 更多