[英]C: Simple copy input (getchar) to output (printf) return extra lines
我正在用C測試一個簡單的程序:
int main() {
int c;
c = getchar();
while ( c != EOF ) {
printf("%c\n", c);
c = getchar();
}
}
但是,當我輸入“ a”,“ b”之類的簡單輸入時,它會打印出“ a \\ n \\ n,b \\ n \\ n” ...有人可以解釋一下嗎? 謝謝!
☛ gcc hello.c; ./a.out
a
a
b
b
c
c
因為它既得到EOL字符,又得到您鍵入的字符。
您輸入的不是“ a”,“ b”,而是“ a \\ nb \\ nc \\ n”,並且您的腳本配置為(基本上)在每個字符之后輸出新行。
因此,在循環中,它第一次獲得“ a”並輸出“ a \\ n”,然后就獲得“ \\ n”並輸出“ \\ n \\ n”。 然后是“ b”和“ b \\ n”,依此類推。
嘗試以下尺寸:
int main() {
int size = 500;
char buff[size];
char* check;
int read;
check = fgets(buff, sizeof(buff), stdin);
while ( check != NULL ) {
printf("%s", buff);
check = fgets(buff, sizeof(buff), stdin);
}
}
看代碼
printf("%c\n", c);
也就是說先打印字符,然后換行。 除了回顯具有字符和換行符的輸入之外。
您可能需要關閉字符回顯以進行交互使用。 或者只是從文件中讀取輸入。
輸入字符並按Enter后,'\\ n'換行符仍保留在輸入流中,並使用第二個getchar()進行拾取。
因此,您的printf會打印出一個換行符,然后再打印另一個,因為它拾取了換行符。
getchar()
從輸入緩沖區獲取一個字符。 默認情況下,輸入模式是行緩沖的(“規范”模式),這意味着您輸入“ a”,然后按Enter / Return鍵,並且只有在將該數據放入輸入緩沖區之后,這會導致兩個字符添加到輸入緩沖區:“ a”字符本身和“ \\ n”字符對應於Enter / Return鍵。
如果需要,不同的操作系統會有不同的切換到非緩沖(“非規范”)模式的方法。 這是UNIX / Linux系統上的ioctl()
或tcsetattr()
魔術,而在Windows上是SetConsoleMode()
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.