[英]Unexpected output using scanf() and printf() in C++
我編寫了以下簡單的代碼片段:
#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
但是,在用cin
和cout
替換scanf()
和printf()
時,會正確生成所需的輸出。 我可能在哪里出錯了?
鏈接到帶有printf()
代碼: http : //ideone.com/NvHQUl
使用cout
鏈接到代碼: http : //ideone.com/PQWe9R
更新: h
表示行數; w
表示列數。
這是因為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"
當然,這就是您所看到的輸出。
scanf
的%c
格式說明符讀取並分配下一個字符, 包括空格和換行符。 根據scanf規格 :
在嘗試解析輸入之前,除[,c和n之外的所有轉換說明符都會消耗並丟棄所有前導空白字符(就像通過調用isspace來確定)。
因此scanf("%c", &shop[i][j]);
將在輸入的每一行末尾將換行符作為常規字符讀取,並將其分配給數組中的某個元素,這將解釋printf
輸出。
要跳過空白,請使用scanf(" %c", &shop[i][j]);
相反(請注意其他
%c
之前的空格)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.