2017-10-08 12 views
0
#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 =キー

私のプログラムが正しい出力を与えるが、最後の行は、ガベージ文字を印刷: enter image description here

私はそれが原因でメモリ割り当てたものの?しかし、私はまだそれに触れていない、と私はそれがそうであるように "文字列"変数を使用していない方法を学びたいので、私はcs50.hパッケージを使用したくない。

ご協力いただければ幸いです。

+0

あなたのバッファには 'sizeof'バイトがありますが、'%s'は読み込むバイト数だけ初期化します。 'length'までループするのではなく、' strlen(name) 'だけにループします(そして' 'を含みます) –

答えて

3

あなたの問題は、ライン

int length = sizeof(name); 

sizeofオペレータはバイト単位で変数のサイズを返しています。この場合、namechar[100]なので、このオブジェクトのサイズは100バイトです。この例では、平文(および暗号文)を与えたほうがはるかに小さくなり、ループが終了し、ガベージメモリ(つまり、割り当てられたスペースをメッセージの格納に使用しなかったスペース)の印刷が開始されました。あなたの代わりに使用する必要がどのような

は、文字列の長さを返します

int length = strlen(name); 

です。 string.hヘッダーを必ず含めてください。

関連する問題