簡體   English   中英

為什么單個數字會附加“D”(在 C 輸出中)?

[英]Why single digit numbers are appended with “D” (in C output)?

為什么單個數字會附加“D”(在 C 輸出中)?

以下代碼

#include <stdio.h>

int main(void)
{
    int c = 0;

    printf("%d\n", c); 

    return 0;
}

一旦編譯並運行,輸出0 ,正如我所期望的那樣。
雖然,這段代碼

#include <stdio.h>

int main(void)
{
    int c = 0;

    while (getchar() != EOF) {
        ++c;
    }

    printf("%d\n", c); 

    return 0;
}

一旦編譯並運行,在立即觸發EOF之后——由於某種原因輸出0D ,盡管c的值(據我所知)應該與第一種情況完全相同。
所有單個數字(即1D2D3D ... 9D )都會發生同樣的情況,從10開始,不再看到附加的D

我想知道:

  1. 為什么在第二種情況下D附加到 output 而不是第一種情況(即使c應該保持相同的值)?

  2. 是否有可能避免這個D附加(以及如何,如果是的話)?

無論出於何種原因,您的代碼根本無法 output 為“D”。 除非確實發生了一些不確定的事情,例如編譯器或 glibc 中的錯誤。 或者可能是 memory 中的位翻轉。

“D”很可能是由於您使用的終端,但您的代碼根本不能 output 它。

嗯,機會很小。 如果您讀取的字符數超過INT_MAX ,則有符號的 integer c將溢出,從而調用未定義的行為。 這不太可能 output 為“D”,但有可能。

在發布問題時,我認為這種行為與這種情況有關,但事實證明,它與代碼無關,只是終端行為
一些程序員老兄在評論中的建議是完全正確的:終端只是輸出程序的^D和 output 然后覆蓋^ ,但不是D ,因此對於個位數的數字 output 最終會附加D
兩個(或更多)數字只會覆蓋整個^D

我可以通過將EOF觸發序列更改為Ctrl + L (通過stty eof ^L )來驗證這一點,然后 output 變為1L2L3L ... 9L
正如Jonathan Leffler在上面的評論中所說,禁用控制字符的回顯(通過stty -echoctl )將解決該問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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