1

私は実験シート用にシーザーズ・サイファーを作っていて、演習のポイントである 3 つのサブタイトル (シーザーズ・サイファー) を暗号化できるようにしました。しかし、私を悩ませていることが1つありました。まず、3 以外に入れると末尾に文字があります。たとえば、「マルウェア」と入力し、キーに 2 を入力します。これは私のコードです:

#include<stdio.h>
#include<stdlib.h>

int main()
{
   char text[100];
   int key,i;

   printf("Please enter a word/sentence (lowercaps) for encrypting :\n ");
   fgets(text,100,stdin);
   printf("Please enter the key that you desire : eg:14\n");
   scanf("%d", &key);
   for(i=0;i<strlen(text);i++)
   {
      if (key>=26)
      {
         key=key%26;
      }
      if (text[i]==' ')
      {
         continue;
      }
      if(text[i]+key>'z')
      {
         text[i]-=97;
         text[i]+=26;
         text[i]+=key;
         text[i]%=26;
         text[i]+=97;
      }
      else
      {
         text[i]=text[i]+key;
      }
   }

   printf("this is your encrypted text : %s", text );
}

コーディングの正しいインデント方法に従ったことを願っています。そのせいで嫌われ者が多かった

4

3 に答える 3

2

charコードは、1) aが小文字の場合を適切に検出していない2) OP の「出力の最後の文字の後の末尾の文字」を引き起こしている'\n'fromを含む非文字を暗号化しています。fgets()

その代わり:

if (text[i] >= 'a' && text[i]<= 'z') {
   text[i] = (text[i] - 'a' + key)%26 + `a`;
}
else {
  ; // nothing 
}

あるいは

if (islower((unsigned char) text[i]) {
   text[i] = (text[i] - 'a' + key)%26 + `a`;
}

注: 上記はASCIIcharとしてエンコードされていることに依存します。

ASCII に依存しないソリューション。

static const char lowercase[] = "abcdefghijklmnopqrstuvwxyz";
char *p = strchr(lowercase, text[i]);
if (p) {
  int offset = (p - lowercase + key)%26;
  text[i] = lowercase[offset];
}
于 2015-09-24T05:46:52.793 に答える
0

Blake_Lead が言ったように、この '\0' 文字はあなたのサイファーで変更されました

実際、fgets() が '\0' を置くため、バッファの長さについて間違っていました。
マニュアル ページから:

終端のヌル バイト ('\0') は、バッファー内の最後の文字の後に格納されます。

したがって、テストを変更するだけです

if (text[i]==' ')

次のような方法で:

 if (text[i] < 'A' || text[i] > 'z' || (text[i] > 'Z' && text[i] < 'a') )
于 2015-09-24T05:03:24.870 に答える