2014-03-05 299 views
0

我對C很新穎。我希望能夠移動字母'x'的次數來創建基本密碼。C凱撒密碼ASCII字母換行

我遇到了islower()函數的問題。我使用'我',但是,我無法將其更改爲角色。

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

string p; 

int main(int argc, string argv[]) 
{ 
    //if argument count does not equal 2, exit and return 1 
    if (argc != 2) 
    { 
     printf("Less or more than 2 arguments given, exiting...\n"); 
     return 1; 
    } 
    else //prompt user for plaintext to encrypt 
    { 
     p = GetString(); 
    } 

    //take the second part of the array (the int entered by user) and store as k (used as the encryption key) 
    //string k = argv[1]; 
    int k = atoi(argv[1]); 

    //function: 
    // c = (p + k) % 26;  
    //iterate over the characters in the string 
    //p represents the position in the alphabet of a plaintext letter 
    //c likewise represents a position in the alphabet 
    char new; 
    for (int i = 0, n = strlen(p); i < n; i++) 
    if (islower((char)i)) 
    { 
     //printf("%c\n", p[i] + (k % 26)); 
     printf("This prints p:%s\n", p); 
     printf("This prints i:%d\n", (char)i); 
     printf("This prints k:%d\n", k); 
     printf("This prints output of lower(i):%d\n", islower(i)); 
     new = (p[i] - 97); 
     new += k; 
     //printf("%d\n", new %26 + 97); 
     //printf("i = |%c| is lowercase\n", i); 
     printf("%c\n", new % 26 + 97); 
    } 
    else { 
     //printf("%c", p[i] + (k % 26)); 
     printf("This prints p:%s\n", p);  
     printf("This prints i:%d\n", (char)i); 
     printf("This prints k:%d\n", k); 
     printf("This prints output of lower(i):%d\n", islower(i)); 
     new = (p[i] - 65); 
     new += k; 
     //printf("%d\n", new % 26 + 65); 
     //printf("i = |%c| is uppercase\n", i); 
     printf("%c\n", new % 26 + 65); 
    } 
    printf("\n"); 
} 

輸出:

[email protected] (~/Dropbox/CS50x/pset2): ./caesar2 1 
zZ < here is my input 
This prints p:zZ 
This prints i:0 
This prints k:1 
This prints output of lower(i):0 
G < here is fails, lower case z should move to lower case a 
This prints p:zZ 
This prints i:1 
This prints k:1 
This prints output of lower(i):0 
A < here is a success! upper case Z moves to upper case A 
+1

模運算符'%'具有比'+'更高的優先級。如果我是你,我會在'printf()'中使用圓括號。 –

+0

我已經更新了,謝謝。 – JT1

+0

我認爲reza的意思是(p [i] + k)%26。 – user1895961

回答

2

在英語中的字母是使用C用作ASCII定義。 'Z'(ASCII 90)後面跟着'{'(ASCII 91)。 要回到「A」,你應該做的所有班次以下列方式:

  1. 由65減去你的ASCII字符它會導致輸出介於0 至25(含)。
  2. 添加位移(移位距離)。
  3. 以模26爲例,以環繞您的結果。
  4. 再次加65。

請記住,這隻適用於英語的大寫字母。因此您可能需要使用ctype.h庫中的toupper()

如果要爲小字符添加類似的功能,請執行上述步驟,將97替換爲65. 要檢查您是否有小字符或大寫,請使用isupper()。 您必須爲特殊字符添加更多和特定的代碼。

+0

isupper()和islower()絕對是我正在尋找的。 – JT1

+0

對於第1步,int new = p - 65但是,輸出是一個字符串。我不應該把它保持爲int嗎? – JT1

+0

你可以用任何你喜歡的方式來做。我會推薦一個'char',因爲它需要更少的內存。 –

0

islower((char)i)檢查循環計數器是否是小寫字符。

你想測試該位置的字符 - islower(p[i])