2012-04-21 14 views
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を使用したとき、私は挿入した場合、これは私に無限ループを与える:無限ループin C

1 FffF 

私は0を追加したり、任意の数は、それが正常に動作したときに:

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

は、どのように私はこれをsloveすることができます

1 FffF0 

無限ループがかなったようなものですか!?

+0

小さな先端をループのbreak返さない必要があるとき:代わりにあなたが手紙をチェックするために 'while'状態で行うように比較を行うための、便利な機能がありますいわゆるisalphaです。また、文字が大文字か小文字かを確認する関数islowerとisupperもあります。 –

答えて

3

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

scanf("%c", &_char); 

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

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

ループを終了する必要があります。

+0

完璧なthnx :) – Rawhi

1

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

だから、scanfは1