2016-04-28 2 views
1

一部の関数は自動的に改行を出力に追加しますが、改行が必要でないシナリオが発生しました。私はそれを修正しようとしたのですが、なぜそれが多くの方法で発生するのか理解できませんが、役に立たないのです。これは以前経験したことのない出力問題です。forループ、三項演算子および条件を使用すると予期しない改行が発生する

私は非常に基本的なプロジェクトをから行っています。Cプログラミング:現代的アプローチ by K.N.キング、第8章、プロジェクト6:特定の文字がそのまま変換されて印刷される「B1FFフィルタ」。適切な出力を得るための条件と組み合わせた三項演算子を使用しました。ここではプログラムがあります:

/* C Programming: A Modern Approach 
     Chapter 8: Arrays, Project 5: B1FF filter 
*/ 

#include <stdio.h> 
#include <string.h> 
#include <ctype.h> 

int main(void) 
{ 
    char message[50]; 
    int msg_len; 

    printf("Enter message: "); 
    fgets(message, 50, stdin); 
    msg_len = strlen(message); 

    printf("In B1FF-speak: "); 

    for (int i = 0; i < msg_len; i++) 
    { 
     message[i] = toupper(message[i]); 

     if (message[i] == 'A' || message[i] == 'B') 
      printf("%c", (message[i] == 'A') ? '4' : '8'); 

     else if (message[i] == 'E' || message[i] == 'I') 
      printf("%c", (message[i] == 'E') ? '3' : '1'); 

     else if (message[i] == 'O' || message[i] == 'S') 
      printf("%c", (message[i] == 'O') ? '0' : '5'); 

     else 
      printf("%c", message[i]); 

     if (i == (msg_len - 1)) 
     { 
      for (int j = 0; j < 10; j++) 
       printf("!"); 

      printf("\n"); 
     } 
    } 

    return 0; 
} 

出力が期待されていません。

Enter message: C is rilly cool 
In B1FF-speak: C 15 R1LLY C00L 
!!!!!!!!!! 

なぜ変更された文字列と感嘆符の間に改行があるのでしょうか?私は、すべてのテキストが印刷された後、ループが終了する直前に改行が発生するように明確に指定しました。私はループの外に改行を印字するなどの変更を試みましたが、感嘆符などのforループは使用しませんでしたが、同じ結果が得られます。その発生の明白な理由はないようです。

答えて

2

fgetsには、宛先にコピーする内容に改行が含まれます。バッファーです。したがって、あなたのキャラクタ毎の印刷ルーチンはそれをそのまま渡します。 Googleでfgetsのため

結果#1:http://www.cplusplus.com/reference/cstdio/fgets/

改行文字がfgets停止読書になりますが、それは関数で有効な文字とみなされ、STRにコピーされた文字列に含まれています。

もちろん、他の回答に記載されているように、印刷時に無視するか、あらかじめ無効にすることができます。

1

fgets()改行文字の読み取りをバッファに保存します。あなたがそれを望まないなら、それを取り除く。

例:

fgets(message, 50, stdin); 
/* remove newline character */ 
{ 
    char* lf = strchr(message, '\n'); 
    if (lf != NULL) *lf = '\0'; 
} 

意味は次のとおりです。

fgets(message, 50, stdin); /* read one line from the standard input */ 
/* remove newline character */ 
{ 
    char* lf /* declare a variable */ 
     = strchr(message, '\n'); /* and initialize it with the pointer to the first '\n' in the string message */ 
    if (lf != NULL) /* check if '\n' is found */ 
     *lf = '\0'; /* if found, replace '\n' with '\0' and delete the newline character (and string after '\n', which won't usually present) */ 
} 
+0

それを片付けてくれてありがとう@underscore_dは、私はfgetsの中に自動的に付加改行()の関数リファレンスを見逃している必要があります。 –

+0

そのコードブロックは、正確に何を段階的に達成していますか?途中で完璧に動作しましたので、ありがとうございます。私はちょうど私がそれを使用する前にその機能を理解していることを確認したい。 –

+0

@ GabrielSaul私はいくつかの説明を追加しました。 – MikeCAT

関連する問題