2014-10-19 44 views
-3

你好堆棧溢出的人。使用c代碼製作凱撒密碼?

說明

我想以下幾點。

我的程序需要輸入一串字母作爲輸入,然後輸出向前旋轉13步。

例如

甲變爲N

B成爲ö

Ç變爲P

d變爲Q

對於這個程序我需要使用ascii表。因此,例如,下殼體= 97一旦我的節目完成它成爲N = 110

我寫了一個小的公式此

C =(C + 13-97)%26 + 97其中,c是我的信。正如你可以看到,如果C = 97,那麼C將最終被110

因此,這裏是我的程序

正如看見我使用了,如果statment來確定,如果我有一個大寫或小寫字母。

/* 97 is lower case a in ascii and 122 is lower case z*/ 

    # include <stdio.h> 

    int main() { 

    char c; 

    printf("please enter a character:"); 


    while (c!=-1) { 

    c=getchar(); 
    putchar (c); 

    if (c>=97 && c<=122) { 

    c=(c+13-97)% 26+97 ; 
    printf("%c \n " ,c); 

     } 
    else 

     c=(c+13-65) % 26 +65 ; 
     printf("%c \n " ,c); 


    } 
    return 0; 
     } 

我的問題是與輸出,例如,如果我插上

而不是n我得到

an 
    n 

    1 
+2

使用'{}'爲其他塊。並替換'else if('A'<= c && c <='Z')'也可以'char c;' - >'int c;' – BLUEPIXY 2014-10-19 18:23:42

回答

0

您將遇到的另一個問題是需要在讀取下一個字符之前刷新輸入緩衝區中剩餘的\ n。基本上,輸入字符後用戶按下Enter,c是從輸入緩衝器中讀取的,但'\n'仍然存在。因此,下一次輸入循環時,\n已經存在於輸入緩衝區中,並在該迭代中被視爲c

爲了防止這種情況發生,到flush輸入緩衝器中的最簡單的方法是定義一個扔掉的intint flush和之後的字符的每個讀取,增加以下內容:

do { flush=getchar(); } while (flush != '\n'); 

這將解全部來自input buffer的其餘字符準備下一次閱讀。 (注:fflush不這樣做對於輸入流)與此結合的實現是:

#include <stdio.h> 

int main() { 

    int c = 0;  /* Always initialize variables */ 
    int flush = 0; 
    int new = 0; 

    printf ("\nPlease enter a character (ctrl+d to exit):\n\n"); 

    while (printf (" char: ") && (c = getchar()) != -1) { 

     do { flush=getchar(); } while (flush != '\n');  /* flush input buffer */ 

     if (c >= 'a' && c <= 'z') 
     { 
      new = (c + 13 - 97) % 26 + 97; 
      printf ("\t lower-case '%c' becomes: '%c'\n\n", c, new); 

     } 
     else if (c >= 'A' && c <= 'Z') 
     { 
      new = (c + 13 - 65) % 26 + 65; 
      printf ("\t upper-case '%c' becomes: '%c'\n\n", c, new); 
     } 
     else 
     { 
      printf ("\n invalid character, try again\n\n"); 
     } 
    } 

    printf ("\n\nexiting.\n\n"); 

    return 0; 
} 

輸出:

Please enter a character (ctrl+d to exit): 

char: a 
      lower-case 'a' becomes: 'n' 

char: b 
      lower-case 'b' becomes: 'o' 

char: n 
      lower-case 'n' becomes: 'a' 

char: o 
      lower-case 'o' becomes: 'b' 

char: A 
      upper-case 'A' becomes: 'N' 

char: B 
      upper-case 'B' becomes: 'O' 

char: N 
      upper-case 'N' becomes: 'A' 

char: O 
      upper-case 'O' becomes: 'B' 

char: 

exiting. 

祝你好運與您的項目。如果遇到其他問題,請留言。


多個字符版本使用函數getline

關於你提到的有關線路輸入問題。下面是一個使用getlinestdin讀取多個字符的版本:

#include <stdio.h> 

int main() { 

    int new = 0; 
    ssize_t nread = 0; /* number of chars read by getline      */ 
    char *line = NULL; /* string holding chars - getline allocates when NULL */ 
    size_t n = 0;  /* limit number of bytes to (ignored when 0)   */ 
    char *p = NULL;  /* point to use to iterate over each char in line  */ 
    int index = 0;  /* simple index for formatted output.     */ 


    printf ("\nPlease enter characters to translate (ctrl+d to exit):\n"); 

    while (printf ("\n input: ") && (nread = getline (&line, &n, stdin) != -1)) { 

     index = 0;      /* reset index     */ 
     p = line;      /* assign pointer to line  */ 
     printf ("\n");     /* just because it looks nice */ 

     while (*p != '\n')    /* getline consumes the '\n' */ 
     { 

      if (*p >= 'a' && *p <= 'z') 
      { 
       new = (*p + 13 - 97) % 26 + 97; 
       printf ("\t char[%2d] : %c => %c\n", index, *p, new); 

      } 
      else if (*p >= 'A' && *p <= 'Z') 
      { 
       new = (*p + 13 - 65) % 26 + 65; 
       printf ("\t char[%2d] : %c => %c\n", index, *p, new); 
      } 
      else 
      { 
       printf ("\n char[%2d] : %c => invalid character\n", index, *p); 
      } 

      p++; 
      index++; 
     } 
    } 

    printf ("\n\nexiting.\n\n"); 

    return 0; 
} 

輸出:

Please enter characters to translate (ctrl+d to exit): 

    input: aAbBcCmMnNoO 

      char[ 0] : a => n 
      char[ 1] : A => N 
      char[ 2] : b => o 
      char[ 3] : B => O 
      char[ 4] : c => p 
      char[ 5] : C => P 
      char[ 6] : m => z 
      char[ 7] : M => Z 
      char[ 8] : n => a 
      char[ 9] : N => A 
      char[10] : o => b 
      char[11] : O => B 

    input: 

exiting. 
+0

我看到是的,我注意到,新角色不斷搞亂輸入感謝指出一個解決方案。 – humblecomputeruser 2014-10-19 19:27:42

+0

經驗告訴我 - 這是下一個問題:) – 2014-10-19 19:40:53

+0

其實我還有一個問題,如果你不介意,它是如果我想輸入多個字母說一個「abc」並將其變成「nop 「我必須能夠使用get char而不是使用字符串來做到這一點。 – humblecomputeruser 2014-10-19 20:04:50

0

while迴路應

while ((c=getchar()) != EOF) 

您的代碼在c是我之前檢查c的值nitialized。你應該得到這個警告。

您不應該在代碼中使用硬編碼的ASCII值。小寫字母a是'a'。小寫字母z是'z'。因此,舉例來說,你可以寫

if (c >= 'a' && c <= 'z') 

注意stdin緩衝區字符,直到你按下鍵return。當您按下return鍵時,getchar會爲您輸入您輸入的字符,然後是換行符'\n'字符。您的代碼只能處理小寫和大寫字符。您需要修改代碼以正確處理非字母字符,例如空格,標點符號,換行符。

+0

可能值得一提的是'EOF'被定義爲' -1',以確保在將測試子句從'-1'切換到'EOF'時不會產生混淆。正如你指出的那樣,問題是檢查未初始化的'c',否則測試條件是OK的。 – 2014-10-19 18:25:34

+0

好的,我看到了回覆的感謝。我認爲它現在應該工作。 – humblecomputeruser 2014-10-19 18:29:36

2

你的代碼是在它的一些小的改動精絕。

 /* 97 is lower case a in ascii and 122 is lower case z*/ 

    # include <stdio.h> 

    int main() 
    { 

    char c; 

    printf("please enter a character:"); 


    while (c!=-1) 
    { 

     c=getchar(); 
     //putchar (c);  // Avoid Printing entered character 

     if (c>=97 && c<=122) 
     { 
      c=((c+13-97)% 26)+97 ; 
      printf("%c \n " ,c); 
     } 
    else 
    {        // Braces missing 
      c=((c+13-65) % 26) +65 ; 
      printf("%c \n " ,c); 
    } 
    return 0; 
    } 
    } 

輸出:

please enter a character : a 
n