在C ++中使用scanf()和printf()的意外输出

时间:2016-08-26 21:52:48

标签: c++ printf scanf cout cin

我写了以下简单的代码片段:

#include<cstdio>
#include<iostream>
using namespace std;

int main()
{
    int w, h;

    scanf("%d %d", &w, &h);

    char shop[h][w];
    for(int i=0; i<h; i++)
        for(int j=0; j<w; j++)
            scanf("%c", &shop[i][j]);
            //cin>>shop[i][j];

    for(int i=0; i<h; i++)
    {
        for(int j=0; j<w; j++)
            printf("%c", shop[i][j]);
            //cout<<shop[i][j];
        printf("\n");
        //cout<<"\n";
    }

    return 0;
}

传递输入如下:

  

4 3
  X1S3
  42X4
  X1D2

我希望输出相同,因为我没有修改代码中的任何内容。但是,当我打印它时,我得到以下输出:

  

X1S
  3
  42
  X4
  X

但是,在用scanf()printf()替换cincout时,会正确生成所需的输出。我可能出错的任何输入?

使用printf()链接代码:http://ideone.com/NvHQUl
使用cout链接代码:http://ideone.com/PQWe9R

更新:h表示行数;而w表示列数。

2 个答案:

答案 0 :(得分:1)

这是因为scanf("%c", ...)将换行符读为字符。

因此,如果您的输入提供LF换行符,例如,您的2D数组最终包含:

\n  X  1  S
 3 \n  4  2
 X  4 \n  X

当你在循环中将它打印出来时,你基本上是在打印:

"\nX1S" "\n"  <-- that's the "\n" you explicitly print after each row
"3\n42" "\n"
"X4\nX" "\n"

当然,这是你看到的输出。

答案 1 :(得分:1)

%c中的scanf格式说明符会读取并分配下一个字符 ,包括 空格和换行符。每scanf specs

  

除了[,c和n 之外的所有转换说明符 在尝试解析输入之前使用并丢弃所有前导空白字符(通过调用isspace确定)。

因此scanf("%c", &shop[i][j]);将读取每行输入末尾的换行符作为常规字符,并将其分配给数组中的某个元素,这解释了printf输出。

要跳过空格而使用scanf(" %c", &shop[i][j]);(请注意之前的额外%c空格。