2016-11-02 23 views
0

我正試圖編寫一個簡短的程序,將每個單詞放在一個新行中。新行可以通過製表符,空格或輸入進行確認。程序結束時將「#」放入控制檯。我遇到這樣的問題,當我將「輸入」到控制檯時,它會在同一行中寫入下一個字符。爲什麼printf(「 n」)不能進入下一行?

第二個想法是將所有這些放在一張表中,這樣我就可以將格式化文本放在一起。我也無法弄清楚這一點。

#include<stdio.h> 
#include <conio.h> 
#define STOP '#' 
int main() 

{ 

    char ch; 
    while ((ch = (_getch())) != STOP) { 
     switch (ch) { 
     case '\n': 
      printf("\n"); 
      break; 
     case '\t': 
      printf("\n"); 
      break; 
     case ' ': 
      printf("\n"); 
      break; 
     default: 
      putchar(ch); 
     } 

    } 

    printf("\nEND"); 
    _getch(); 


    return 0; 
} 
+1

當您提供「enter」時,您是否檢查'_getch()'返回的內容? – Martin

+2

在Windows中,爲新行發出「\ r \ n」。 –

+0

@JohnnyMopp無論OS行結束符是否爲單個字符,C標準都需要'printf(「\ n」)'到DTRT。 (具體來說,在文本模式下打開的FILE對象的輸入和輸出都需要在'\ n'和OS的行結束符之間進行轉換。)'_getch'不是C標準的一部分,因此它不受此影響規則。 – zwol

回答

3

因爲打「進」的問題回車字符(\r),不換行一個。

當我按下「enter」鍵時,我注意到當光標跳回到行首時。

修正你的代碼是這樣的(因式分解的case語句太):

#include<stdio.h> 
#include <conio.h> 
#define STOP '#' 
int main() 

{ 

    char ch; 
    while ((ch = (_getch())) != STOP) { 
     switch (ch) { 
     case ' ': 
     case '\t': 
     case '\r': // what was missing 
      printf("\n"); 
      break; 
     default: 
      putchar(ch); 
     } 

    } 

    printf("\nEND"); 
    _getch(); 


    return 0; 
} 
3

你可能會得到一個回車('\r')這是什麼返回通常會產生。

所以你也需要檢查一下。您的代碼可以簡化:

int main(void) 
{ 
    while((ch = _getch()) != STOP) 
    { 
    if(ch == ' ' || ch == '\n' || ch == '\r' || ch == '\t') 
     ch = '\n'; 
    putchar(ch); 
    } 
} 

由於我們總是每次迭代只打印一個字符,因此不需要使用多個打印功能。此外,使用printf()打印單個常量字符是矯枉過正的。