我写了以下简单的代码片段:
#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()
替换cin
和cout
时,会正确生成所需的输出。我可能出错的任何输入?
使用printf()
链接代码:http://ideone.com/NvHQUl
使用cout
链接代码:http://ideone.com/PQWe9R
更新:h
表示行数;而w
表示列数。
答案 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
空格。