簡體   English   中英

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

[英]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

但是,在用cincout替換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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM