-1

複数の空白を単一の空白に置き換えようとしています。

#include <stdio.h>
#include <stdlib.h>
#define MAXLINE 500

main() {
    char text[MAXLINE];
    int i;

    for(i = 0; (text[i] = getchar()) != EOF && text[i] != 'x'; i++) {
        if(text[i] == ' ')
            i++;

        while((text[i] = getchar()) != EOF && text[i] != 'x' && text[i] == ' ');

        if(text[i] == EOF || text[i] == 'x')
            break;
    }

    text[i] = '\0';

    printf("\n\n-- Result --\n%s", text);
}

getchar()が押された後に文字が期待されることは知っていenterますが、人々がそれを使用して文字列全体を取得する方法を何度も見てきEOFました。この例でも、whileループをコメント アウトすると機能します (空白なしで 1 つの単語を記述した場合、正しい文字列が得られます)。私が望むのは、人が書き込むすべての文字を配列に入れることです。getchar()この場合、関数を使用しても問題ありませんか? はいの場合、このコードを機能させるには何を変更する必要がありwhileますか? 私が言ったように、空白やループappleなしで単語などを書くとうまくいきます。while

4

3 に答える 3

0

入力の最後までユーザーからのすべての入力を読み取り、行に数回発生するスペースをスキップするには、次のようなものを使用します。

#include <stdio.h>
#include <stdlib.h>
#define MAXLINE 500

int main() {
    char text[MAXLINE];
    int i;
    int c;

    c = getchar();
    for (i = 0; c != EOF && i < MAXLINE-1; ++i) {
        text[i] = c;

        if ( c != ' ' ) {
            c = getchar();
        } else {
            while ( c == ' ' )
                c = getchar();
        }
    }
    text[i] = '\0';

    printf("\n\n-- Result --\n%s", text);
}
于 2013-07-12T11:48:26.243 に答える
0

getcharintは、ではなく を返します。これcharは、 に収まるよりも 1 つ多い値を返すことができなければならないためcharです。char重要な情報が失われるため、結果を に割り当てるのはプログラミング エラーです。char プレーンが署名されているか署名されていないかに応じてEOF、char に割り当てた後にチェックすると、見つからないEOF(プレーン charで署名されていない) か、入力の特定の文字 ( ÿLatin 1 では通常) が として扱われEOFます。

C++ では に相当しますがstd::cin.get()、より一般的には次のように記述します。

for ( int i = 0;
        i < sizeof( text ) && std::cin.get( text[i]) && text[i] != 'x';
        ++ i ) {
    //  ...
}

(もちろん、C++ では、ほとんどの場合、std::string を単一のcharorintで入力に使用します。)

C では (実際に使用しているように見えるため)、追加の中間変数が必要です。

int ch;
for ( int i = 0;
        i < sizeof(text) && (ch = getchar()) != EOF && ch != 'x';
        ++ i ) {
    text[i] = ch;
    //  ...
}

どちらの言語でも、最初の条件として境界チェックが必要であることに注意してください。(C++ では、を使用している場合は必要ありません std::string。)

于 2013-07-12T11:51:34.547 に答える
0

while ループはインクリメントせずに読み取りますi。したがって、読み取られたすべての文字は、次のループによって上書きされるため、実際には破棄されます。複数の空白を1つの空白に置き換えるだけなら、そのようなことをするかもしれません

char text[1024];
int  i;
int  c;

for(i = 0; i < sizeof(text)-1 && (c = getchar()) != EOF && c != 'x'; ) {
     if( c != ' ' || i == 0 || text[i-1] != ' ' )
           text[i++] = c;
}

コメントで既に述べたように: の結果をgetchar()char に直接割り当てないでください。そうしないと、読み取ったバイトを EOF と比較すると、まだファイルの終わりに達していなくても true になる可能性があります。

于 2013-07-12T11:51:47.850 に答える