【问题标题】:Why can't I scan %c character?为什么我不能扫描 %c 字符?
【发布时间】:2015-01-19 14:03:52
【问题描述】:

c编程时,字符串扫描成功后不是扫描字符。

char s[10],c;
scanf("%s",s);
scanf("%c",&c);
printf("%s\n",s);
printf("%c",c);

【问题讨论】:

  • 会发生什么?你能指望什么?你看到了什么呢?你期待什么样的答案?
  • 这个问题每天都会被问到,考虑到它给新手带来的问题数量,应该认真对待。至少提供并回答或重复投票。
  • 也许,编译器不喜欢你写的东西。这就是为什么它没有扫描。
  • 你应该 printf("Decimal value of c is %d", (int) c); 看看你实际得到了什么。
  • 试试scanf("%s %c", s, &c);

标签: c scanf


【解决方案1】:

scanf手册:

说明符 c:

匹配长度由最大值指定的字符序列 字段宽度(默认为 1);下一个指针必须是指向 char 的指针,并且 必须有足够的空间容纳所有字符(没有终止 null 添加字节)。 通常会跳过前导空白。到 首先跳过空格,在格式中使用显式空格。

所以,将格式更改为" %c"

【讨论】:

    【解决方案2】:

    这个

    char s[10],c;
    scanf("%s",s);
    scanf("%c",&c);
    printf("%s\n",s);
    printf("%c",c);
    

    不会按预期工作,因为当您使用scanf("%s",s); 时,您将从键盘输入一个字符串然后按回车键。 scanf("%s",s); 会将字符串存储在缓冲区中的s 中,但会让enter 或更准确地说是\n 在缓冲区中。下一个 scanf("%c",&c); 将读取 \n,因为它有 1 个字符长并将存储在 c 中。但是当你打印它时,你什么也看不到,因为它只是一个新行。为防止所有这些更改,将第二个 scanf("%c",&c); 更改为 scanf(" %c",&c);\n 留出空间。

    希望这可以帮助您了解正在发生的事情。

    【讨论】:

    • "但是当您打印它时,您什么也看不到,因为它只是一个新行" - OP 什么也看不到,OP 会看到一个新行。
    【解决方案3】:

    在为字符串 's' 输入字符后,您输入一个 enter '\n' 下一次扫描字符会捕获新行并打印它。您可以做的是,捕获新行 '\n'。把 scanf("%c",&c); 再用一次就行了。

    char s[10],c;
    `scanf("%s",s);`
    `scanf("%c",&c);`
    `scanf("%c",&c)`
    `printf("%s\n",s);`
    `printf("%c",c);`
    

    【讨论】:

      【解决方案4】:

      您之前扫描的字符串末尾的 'enter' 或 '\n' 是您的 scanf("%c", &c) 扫描的内容

      尝试在你的 scanf("%s",s) 之后放置一个虚拟 getchar()

      scanf("%s",s);
      getchar();
      scanf("%c",&c);
      printf("%s\n",s);
      printf("%c",c);
      

      或者,在 scanf("%c",c) 中的格式说明符之前留一个空格,并将其设为 scanf(" %c",c)

      scanf("%s",s);
      scanf(" %c",&c);
      printf("%s\n",s);
      printf("%c",c);
      

      在这两种情况下,虚拟 getchar() 和 %c 之前的额外空格都会处理你不需要的 '\n' 字符

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-11-11
        • 1970-01-01
        • 1970-01-01
        • 2022-01-22
        • 2018-10-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多