2016-11-02 6 views
0

私は新しい行に各単語を入れる短いプログラムを書こうとしています。新しい行は、tabulator、spaceまたはenterで確認できます。プログラムの最後はコンソールに "#"を入れています。私はコンソールに "enter"を置くと、次の文字を同じ行に書き込むという問題があります。なぜprintf( " n")が次の行に移動しないのですか?

2つ目のアイデアは、すべてをテーブルに作成することです。そのため、書式設定されたテキストをすべてまとめて配置することができます。私もこれを理解することはできません。

#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

「入力」を提供するときに '_getch()'によって返される内容を確認しましたか? – Martin

+2

Windowsでは、新しい行に「\ r \ n」を発行します。 –

+0

@JohnnyMopp C標準では、OSの行ターミネータが単一の文字であるかどうかにかかわらず、DTRTに 'printf(" \ n ")'が必要です。 (具体的には、テキストモードで開いているFILEオブジェクトの入力と出力の両方が、 '\ n 'とOSの行終端文字との間で変換する必要があります)' _getch'はC標準の一部ではないので、ルール。 – zwol

答えて

3

打つ「と入力し、」キャリッジリターン文字(\r)、ない改行1を発行しますので。

「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); 
    } 
} 

我々は常にイテレーションごとに1つの文字、複数の印刷機能を使用する必要はありませんを印刷しているので。また、1つの定数文字を印刷するのにprintf()を使用することは過剰です。

関連する問題