3

解読プログラムを書いていますが、不明な数の文字列をスキャンし、入力された各文字列をデコードする必要があります。EOF に達したら、プログラムを終了する必要があります。

プログラムを終了させるのに苦労しています。while ループ条件ステートメントの文字列の最初の文字をスキャンすると、これが実行されますが、条件ステートメントの下の実際の文字列をスキャンすると、文字列に最初の文字がありません。最初の文字をスキャンして、その文字を文字列の先頭に配置する必要がありますか?

私の状況でEOFを適切にテストするにはどうすればよいですか?

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

int main(void)
{
    int i;
    char code[300];

    while(scanf("%c", &code[0])!=EOF)
    {
        scanf("%s", code);

        for(i=0; i<strlen(code); i++)
        {
            decrypt message one char at a time
        }
        printf("\n");
    }
    return 0;
}
4

3 に答える 3

4
while (scanf("%s", code) == 1)
{
    // no need for second scanf call
    ...
于 2013-04-07T18:41:33.597 に答える
0

at allを使用scanfすることは、この特定の問題には悪い考えです。

while(scanf("%c", &code[0])!=EOF)

このscanf呼び出しは、1 文字を読み取ります。を使用するだけgetchar()です。

scanf("%s", code);

for(i=0; i<strlen(code); i++)
{
    decrypt message one char at a time
}

このscanf呼び出しでは、任意の数の文字を読み取ることができます (空白をスキップした後。空白をスキップしてもよろしいですか?)。つまり、 から読み取る文字が多すぎる場合stdin、バッファ オーバーフローが発生し、 に表示される内容を完全に制御しない限り回避できませんstdin

code次に、配列をループして、strlen()処理する各文字を呼び出します。strlen()通常、配列の先頭から終端までスキャンする必要があるため、'\0'これは非効率的です。文字列の文字をトラバースする必要がある場合は、一度呼び出して値を保存するか、終了文字strlen()を探します。'\0'

ただし、一度に 1 文字ずつ処理しているだけなので、一度に1 文字ずつ読み取るだけです。

while ((c = getchar()) != EOF) {
    /* process a character */
}

一度に 1 文字ずつ読み取るのは非効率であると心配しないでください。バッファリングがそれを処理します。

于 2013-04-07T18:46:53.463 に答える
0
while (scanf("%c", &code[0]) == 1)
{   scanf("%s", &code[1]);
    ...
于 2013-04-07T18:31:41.823 に答える