0
#include <stdio.h>

int main()
{
    char _char = 32;
    int x, p, i, d;
    scanf("%d ", &x);
    while(_char == 32)
        _char = getchar();
    x = x%26;
    printf("The encrypted string is: ");
    while((_char >= 'a' && _char <= 'z') || (_char >= 'A' && _char <= 'Z'))
    {
        if(_char >= 'a' && _char <= 'z')
            _char = 'a' + (_char + x - 'a')%26;
        else
            _char = 'A' + (_char + x - 'A')%26;
        d = 'a' - 'A';
        p = (_char >= 'a') ? _char - d : _char + d;
        printf("%c", p);
        scanf("%c", &_char);
    }
    return 0;
}

コードの説明 : プログラムは、数字 'x' の後にスペースと文字列を受け取り、最初の数字まで、または受け取る文字がなくなるまで、これらの文字を (変更して) 印刷します。コード ブロックで実行すると正常に動作しますが、CMD を使用して入力をファイルとして挿入すると、挿入すると無限ループが発生します。

1   FffF 

0 または任意の数値を追加すると、正常に動作します。

1   FffF0

無限ループは次のようになります。

暗号化された文字列は次のとおりです。 BBBcccDDDeeefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz....

どうすればこれをsloveできますか!?

4

2 に答える 2

3

スキャンする入力がこれ以上ない場合は、

 scanf("%c", &_char);

変更しません_char。スキャンの戻り値を確認する必要があります。

if (scanf("%c",&_char) < 1) break;

その後、ループを終了します。

于 2012-04-21T16:03:51.427 に答える
1

の戻り値をチェックしないscanfので、入力が終了したことを検出しません。Scanf は、一致したアイテムの数を返します。成功した場合、これは 1 です。最初のアイテムの前にファイルの終わりに達すると、-1 が返されます。

したがって、 1 を返さないbreak場合はループする必要があります。scanf

于 2012-04-21T16:06:07.740 に答える