0

using を読み取り、結果を usingstdinscanf返す単純な C++ プログラムがあります。stdoutprintf


#include <iostream>
using namespace std;

int main()
{
    int n, x;
    int f=0, s=0, t=0;

    scanf("%d",&n); scanf("%d",&x);

    for(int index=0; index<n; index++)
    {
        scanf("%d",&f);
        scanf("%d",&s);
        scanf("%d",&t);

        if(x < f)
        {
            printf("first\n");
        }
        else if(x<s)
        {
            printf("second\n");
        }
        else if(x<t)
        {
            printf("third\n");
        }
        else
        {
            printf("empty\n");
        }
    }

    return 0;
}

g++ でコンパイルし、Linux で実行しています。次のように、テキスト ファイルを入力として使用してプログラムを実行し、出力を別のテキスト ファイルにパイプします。

プログラム < in.txt > out.txt

問題は、out.txt が次のようになっていることです。

結果1_
結果2_ 結果
3_
...

「_」は各行末の余分なスペースです。gedit で out.txt を表示しています。

追加のスペースなしで出力を生成するにはどうすればよいですか?

私の入力ファイルは次のようになります。

2 123
123 123 123
123 234 212

編集:この問題の回避策を見つけることができました:printf("\rfoo"); ご意見ありがとうございます!

4

8 に答える 8

2

行末文字は次のとおりです。

System  Hex     Value   Type
Mac     0D      13      CR
DOS     0D 0A   13 10   CR LF
Unix    0A      10      LF 

各システムの行末については、次のことができます。

printf("%c", 13);
printf("%c%c", 13, 10);
printf("%c", 10);

これを次のように使用できます

printf("empty");
printf("%c", 10);

ウィキペディアの改行記事はこちら。

于 2008-12-08T21:45:17.213 に答える
2

ステートメントから '\n' を削除してprintf()、コードを再度実行してください。出力ファイルが 1 つの長い単語 (スペースなし) のように見える場合、テキストの後に挿入されるのは '\n' だけであることがわかります。

out.txt ファイルを読み取るために使用しているエディターでは、出力の後に余分なスペースがあるように見えるだけだと思います。

それでもわからない場合は、out.txt を読み込んで各文字の ASCII コードを判別する簡単なプログラムを作成できます。

于 2008-12-08T21:45:21.537 に答える
1

サンプルプログラムには多くのエラーがあるため、これを理解するのは少し難しいです:

g++ -o example example.cc
example.cc: In function 'int main()':
example.cc:19: error: 'k' was not declared in this scope
example.cc:22: error: 'o' was not declared in this scope
example.cc:24: error: 'd' was not declared in this scope
make: *** [example] Error 1

しかし、それは入力ファイルにはなりません。あなたのscanfは、intsに入力しているものをロードします。ただし、この例は次のとおりです。

/* scan -- try scanf */
#include <stdio.h>

int main(){
    int n ;
    (void) scanf("%d",&n);
    printf("%d\n", n);
    return 0;
}

この結果が生成されました:

bash $ ./scan | od -c
42
0000000    4   2  \n                                                    
0000003

Mac OS/X で。実際に実行しているコードと od -c の結果のコピーを入手してください。

于 2008-12-08T21:56:51.123 に答える
0

これにはほど遠いように感じますが、これを Windows で実行すると \r\n が行末記号として表示され、おそらく *nix では、Windows を認識しないテキスト エディターでは、' \r は印刷できないため、\r は一般的な空白として取得されます。

これをテストする最善の方法は、16 進エディタを使用して自分でファイルを確認することです。

于 2009-07-01T03:52:26.017 に答える
0

timhon が尋ねたように、ここでさらに情報が必要です。どの環境で作業していますか? Linux、Windows、Mac? また、これらの余分なスペースを表示するテキスト エディターは何を使用していますか?

于 2008-12-08T21:39:28.130 に答える
0

私の推測では、あなたのスペースは実際にはスペースではありません。走る

od -hc out.txt

それが本当にスペースであることを再確認します。

于 2008-12-08T21:41:30.093 に答える
0

まず、o と d が定義されていないため、指定したコード サンプルはコンパイルされません...

次に、入力ファイルから読み込んでいる行の末尾に空白がある可能性があります。viで開いてみてください。それ以外の場合は、出力の前に各行でトリム関数を呼び出して、それを完了することができます。

幸運を!

于 2008-12-08T21:46:16.683 に答える
0

期待するプログラムの出力を見ていることを確認してください。これには構文エラーがあります ( の後に ";" がありませんint n)。

于 2008-12-08T21:46:40.410 に答える