2

ユーザーが値を入力したことを確認するために、このコードを取得しようとしています。gets() を使用すると機能しますが、 fgets() に変更すると機能しなくなります。ユーザーが 1 文字以上 25 文字未満の文字列を入力するまでループし続けたい コードで明らかでない場合、プログラミングは初めてです。ありがとう!

int main(void)
{
    char input[25], inputNew[25];
    int i;
    int x;
    int y;
    do
    {
        printf("Please enter a string less then 25 characters!\n");
        fgets(input, sizeof(input), stdin);  
        y = strlen(input);  
    }
    while(y>25 || y<=0);

    for (i = 0; i <= strlen(input); i++)
    {
        inputNew[i] = toupper(input[i]);
        for (x = 1; x <= strlen(input); x+=2)
        {
        inputNew[x] = tolower(input[x]);
        }
    }
    printf("The new value is: %s.\n", inputNew);
return 0;
}
4

4 に答える 4

6

fgets末尾の改行を保持しますが、それを破棄しますgets

y <= 1したがって、を使用する場合は、チェックをに変更する必要がありますfgets

于 2012-10-16T04:45:16.723 に答える
1

まず第一に、深刻なコードでは避けくださいgets()。設計が悪く、安全ではありません。絶対に使用しないでください。gets()

2番。fgets()バッファーの最後に改行を保持します (whileはそれをgets()破棄します)。

3つ目は、少なくとも 1 文字 (改行) を読み取る可能性が高いためy <= 0、 の場合はおそらく間違っています。fgets()に置き換える必要がありy < 2ます。

最後に、最も重要なこと:コードをインデントしてください。:)

于 2012-10-16T04:50:01.770 に答える
0

nneonneoは答えに私を打ち負かしました:

get()関数は、改行文字(存在する場合)が文字列に格納されないことを除いて、無限のサイズとstdinのストリームを持つfgets()と同等です。

http://www.manpagez.com/man/3/fgets/から

参照を追加しました...

于 2012-10-16T04:46:35.117 に答える
0

変数 input を静的サイズ 25 で宣言しました。したがって、 y = strlen(input); のサイズが大きくなる可能性はありません。

あなたの

char input[25];

char input[100];

25以上。

于 2012-10-16T04:54:26.083 に答える