#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
int main()
{
char name[100];
int key;
printf("enter plaintext:\n");
fgets(name, 100, stdin);
int length = sizeof(name);
printf("please enter key:");
scanf("%d", &key);
printf("plain text: %s\n", name);
printf("ciphertext:");
for (int i = 0; i < length; i++) {
if (name[i] >= 65 && name[i] <= 90) {
int c = (int)(name[i] - 'A');
char d = 'A' + (char)((c + key) % 26);
printf("%c", d);
}
else if (name[i] >= 97 && name[i] <= 122) {
int c = (int)(name[i] - 'a');
char d = 'a' + (char)((c + key) % 26);
printf("%c", d);
}
else
printf("%c", name[i]);
}
return 0;
}
こんにちは、 だからこれは私がハーバードによるもちろん「CS50」で解決しようとしてきた運動です。 それは、文字列、キーを取り、シーザー暗号だし、暗号化印刷: C =(PI + K)26%ビジュアルプリントゴミの手紙 - シーザー暗号運動し
Cを - 最終解読文字 PI =位置文字(= 0、B = 1 ..) K =キー
私のプログラムが正しい出力を与えるが、最後の行は、ガベージ文字を印刷:
私はそれが原因でメモリ割り当てたものの?しかし、私はまだそれに触れていない、と私はそれがそうであるように "文字列"変数を使用していない方法を学びたいので、私はcs50.hパッケージを使用したくない。
ご協力いただければ幸いです。
あなたのバッファには 'sizeof'バイトがありますが、'%s'は読み込むバイト数だけ初期化します。 'length'までループするのではなく、' strlen(name) 'だけにループします(そして' 'を含みます) –