2016-07-04 7 views
-3

edxのプログラミング入門からcaesar.cというプログラム割り当てを実行しようとしています。シーザー暗号化を使用して文字列を暗号化できるプログラムが必要です。したがって、ユーザーはキー(コマンドライン)を入力する必要があります。例えば2のキーを持つ 'A'文字は 'C'文字で暗号化する必要があります。アルファベット文字の数である26を超えるキーを入力する必要があるときに問題が発生します。たとえば27のキーと 'A'文字の場合、プログラムは1のように 'B'を返さなければなりません。Caesar.cでつづられました。

文字のASCII値を0から26のアルファベットの値に変換しようとしました。キーが26以上の場合はモジュラス演算子を使用します。 セグメンテーション違反が返されます。誰かが私のエラーの原因のいくつかの提案を私に助けることができますか?

#include <stdio.h> 
#include <cs50.h> 
#include <stdlib.h> 
#include <string.h> 
#include <ctype.h> 

int key; 

// function for an alphabetic value with non capital letters 

int alpha_low(char c) 
{ 
    int alpha_value; 
    alpha_value = (int) c - 97; 
    return alpha_value + (key % 26); 
} 

// function to return to ascii valuee for non capital letters 

char ascii_low(char c) 
{ 
    return (char) alpha_low(c) + 97; 
} 

// function for an alphabetic value with capital letters 

int alpha_up(char c) 
{ 
    int alpha_value; 
    alpha_value = (int) c - 65; 
    return alpha_value + (key % 26); 
} 

// function to return to ascii value for capital letters 

char ascii_up(char c) 
{ 
    return (char) alpha_up(c) + 65; 
} 


int main(int argc, string argv[]) 
{ 
     int result; 
     string p; 
     key = atoi(argv[1]); 

    if(argc != 2 || key < 0) 
    { 
     printf("Usage: ./caesar key(positive integer)\n"); 
     return 1; 
    } 

    printf("Please, write a plaintext: "); 
    p = GetString(); 

    for(int i = 0, n = strlen(p); i < n; i++) 
    { 
     if (isalpha(p[i])) 
     { 
      if (islower(p[i])) 
      { 
      result = alpha_low(p[i]); 
      printf("%c", ascii_low(p[i])); 
      } 
      else if(islower(p[i])) 
      { 
       result = alpha_up(p[i]); 
       printf("%c", ascii_up(p[i])); 
      } 
     } 
    }  

    return 0; 
} 
+2

デバッガを使用しようとしましたか? 'if(islower)else if(islower)'? – purplepsycho

+0

自分の代わりにtolowerとtoupperを使用します。 –

+1

'./caesar 27'の問題を再現できません。' GetString'が壊れていないか、またはパラメータを忘れていない限り、segfaultを引き起こすことはできません(atoi(argv [1] argv [1] 'が存在するかどうかを調べる前に)。 – molbdnilo

答えて

2

ようにする必要があり、アルファベット文字をCAESARする機能(基本ステップに分解):ここで

は、プログラムの

int caesar_lower(int c,int key) { 
    int v = c-'a'; // translate 'a'--'z' to 0--25 
    v = v+key;  // translate 0--25 to key--key+25 
    v = v%26;  // translate key--key+25 to key--25,0--key-1 
    v = v+'a';  // translate back 0--25 to 'a'--'z' 
    return v; 
} 
+0

ありがとうございます。あなたの関数は私の2つの関数を合成しますが、私がプログラムを実行すると、大文字は印刷されず、単語の間にはスペースはありませんが、低い文字は暗号化されたものになります。コードを改善するための提案はありますか?私は正直には大文字を考慮しない理由を知らない –

+0

私はスペースの問題(実際にはかなり愚かな問題)のために解決した...なぜあなたは2倍を使用したので、caesar_upper関数が起動しない理由を理解する必要があります –

+0

同じテスト 'if(islower())' ... 'if(islower())... else if(isupper())' ... –

関連する問題