【问题标题】:Reading array of character读取字符数组
【发布时间】:2014-04-07 19:01:55
【问题描述】:

我用 C 语言编写了一个读取字符数组的程序。它不能正常工作。

#include <stdio.h>

int main()
{
    char a[50];
    int n, i;
    scanf("%d", &n);
    for(i=0; i<n; i++)
        scanf("%c", a+i);
    for(i=0; i<n; i++)
        printf("%c ", *(a+i));
    return 0;
}

这个程序没有读取我想要的字符。

输入

5
a b c d e

程序打印

 a   b   

当我将 scanf("%c", a+i) 更改为 scanf(" %c", a+i) 时,它运行良好。

有人能解释一下为什么第一个代码没有按我的意愿工作吗?

【问题讨论】:

  • 这是 C 代码,不是 C++....
  • 您可能想研究scanf()、空格消耗,以及在使用前者时导致后者的问题。
  • 阅读 Scanf 手册说:“一系列空白字符(空格、制表符、换行符等;参见 isspace(3))。该指令匹配任意数量的空白,包括没有,在输入中。” 一个很好的学习链接C Printf and Scanf Reference
  • 也更好scanf("%d\n", &amp;n);“吃”缓冲新行

标签: c arrays character printf scanf


【解决方案1】:

scanf("%c", a+i); 不起作用,因为它消耗了在先前的 scanf 调用中留在 stdin 缓冲区中的换行符。 scanf 格式字符串中的 %c 转换说明符匹配一个字符,并且通常跳过前导空格被抑制。当您在scanf的格式字符串中添加前导空格时

scanf(" %c", a + i);
   //  ^ note the leading space

表示scanf 将读取并丢弃任意数量的前导空白字符。因此它适用于您的情况。

【讨论】:

    【解决方案2】:

    空格也是一个字符。你可以参考这里的文档:

    http://www.cplusplus.com/reference/cstdio/scanf/

    您在 5、2 个字符、2 个空格后读取新行。

    【讨论】:

      【解决方案3】:

      仔细阅读scanf(3) 的文档(这是一个标准的 C 函数,而不是惯用的 C++)。

      在其格式字符串中:

         ·      A sequence of white-space characters (space, tab, newline,
                etc.; see isspace(3)).  This directive matches any amount of
                white space, including none, in the input.
      

      更具体的 C++ 方法是使用 operator >>std::istreamget 成员函数

      【讨论】:

        猜你喜欢
        • 2013-03-20
        • 2013-01-08
        • 2020-09-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-16
        • 1970-01-01
        相关资源
        最近更新 更多