2016-10-17 5 views
0
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
int count=0; 
int main(){ 
    int n; 
    scanf(" %d",&n); 
    char *s = (char *)malloc(10240 * sizeof(char)); 
    scanf(" %s",s); 
    int length=strlen(s); 
    char array[length+1]; 
    int k; 
    scanf(" %d",&k); 
    while(*s!='\0') 
     { 

     char a= *s + k; 
     if(a>90 && *s<=90) 
      { 
      a=65+(k-1); 
      array[count]=a; 
     } 
     else if(a>122 && *s<=122) 
      { 
      a=97+(k-1); 
      array[count]=a; 
     } 
     else if (a >=0 && a<=64) 
      { 
      array[count]=a; 
     } 
     else if(a>=123 && a<=126) 
      { 
      array[count]=a; 
     } 

     count++; 
     s++; 


    } 
    array[count+1]='\0'; 
    printf("%s",array); 
    return 0; 
} 

以下のコードでは、暗号化されていない各文字は、アルファベット順にリストされた後に「k」スペースを含む文字に置き換えられます。アルファベットは大文字と小文字を区別し、循環的であると考えてください。 'k'がアルファベットの最後を過ぎて回転すると、それは最初にループします(すなわち、 'z'の後の文字は 'a'、そして 'Z'の後の文字は 'A'です)。シーザー暗号暗号アルゴリズムの出力としてガベージ文字を与える以下のコードは何ですか?

私は間違っているところに行くことができません。文字の可能な入力シーケンスごとにnullを印刷しています。特殊記号は暗号化された文字列では変更されません。

+0

['malloc()'と家族の戻り値を 'C'にキャストしない理由についてのこのディスカッションを参照してください。](http://stackoverflow.com/q/) 605845/2173917)。 –

+0

...特に ''を含んでいないので、 'malloc'を正しく使うためには必須です。そして関連して、あなたの 'array []'は小さすぎます。ターミネータのためのスペースを残さないでください。 – WhozCraig

+0

私はそれを含めるとしても、出力が変更されることはありません。 – stackuser

答えて

0
k = 2; //<== random input 
while (*s != '\0') 
{ 
    printf("count %d\n", count); 
    char a = *(s + k); 
    ... 
} 

このループは、文字列sの終わりに行き、そしてchar ak位置現在のインデックスの後にある文字を抽出しようとします。

文字列の最後にある場合、*(s + k)は範囲外です。私は次のようにコードを書き換えることをお勧めします:

int i; 
for (i = 0; i < length; i++) 
{ 
    if (i + k == length) break; 
    if (i + k < 0) break; //assuming k can be negative 
    char a = s[i + k]; 
    ... 
} 

この方法i+kは常に0lengthの間で有効な指標です。

もう一つの問題はここにある:

if (a>90 && *s <= 90) 
{ 
    a = (char)(65 + (k - 1)); 
    array[count] = a; 
} 
else if (a>122 && *s <= 122) 
{ 
    a = (char)(97 + (k - 1)); 
    array[count] = a; 
} 
else if (a >= 0 && a <= 64) 
{ 
    array[count] = a; 
} 
else if (a >= 123 && a <= 126) 
{ 
    array[count] = a; 
} 
count++; 

少なくともこれらの条件が満たされるという保証はありません。実際には、すべての条件が偽である可能性があります。だから、array[0]は未初期化のままですが、countは依然としてインクリメントされています。したがって、arrayは最後にゴミを含んでいます。 countは、array[count]が設定されている場合にのみインクリメントされるように変更する必要があります。

シーザー暗号化では、文字を左右にシフトしたいとします。これを行うには%演算子を使用します。

strcpy(s, "ABCDEFGZ"); 
int length = strlen(s); 
char *array = malloc(length + 1); 
int shift = 2; 
int i; 
for (i = 0; i < length; i++) 
{ 
    char c = s[i]; 
    if (c >= 'A' && c <= 'Z') 
     c = 'A' + (c - 'A' + shift) % 26; 
    array[i] = c; 
} 
array[i] = 0; 

'Z'が右にずれているノート、%オペレータは、必ずそれが上記の機能は、それが下部ケースのためではない、完全な動作しませんされて'Z'

'A'の間の範囲にに戻って取得可能あなたの宿題のためのものです...

関連する問題