2015-09-27 49 views
0
#include<stdio.h> 
int main() 
{ 
    int amount,i; 
    char message[81],encry[81]; 
    printf("Enter message to be encrypted : "); 
    gets(message); 
    printf("Enter shift amount (1-25) : "); 
    scanf("%d"); 
    for(i=0;message!='\0';i++) 
    { 
     if(message[i] >='A' && message[i] <='Z') 
     encry[i]=((message[i]-'A')+amount)%26+'A'; 
    } 
    printf("Encrypted message : "); 
    int j; 
    for(j=0;message[j]!='\0';j++) 
    printf("%c",encry[j]); 

return 0;} 

我嘗試寫一個凱撒密碼,但它無法運行。請幫幫我。 謝謝。爲什麼我的凱撒密碼不能運行?

+3

請描述你的意思是「無法運行」。提供有關錯誤的更多詳細信息將有助於看到您計劃的人員。歡迎來到StackOverflow! – plamut

回答

4

printf("Enter shift amount (1-25) : "); 
scanf("%d"); 
     ^missing variable here (you need to pass an argument of type int *) 

然後你會在哪裏輸入密鑰?

你需要採取輸入amount變量這樣的 -

printf("Enter shift amount (1-25) : "); 
scanf("%d",&amount); 

所以,你沒有任何東西存儲在amount,它是未初始化的。而你使用它,因此它會導致不確定的行爲。

2.在這個循環 -

for(i=0;message!='\0';i++)  // you compare here char * with char 

條件應該是 -

for(i=0;message[i]!='\0';i++) 

不要使用gets採取輸入,它不會阻止溢出。使用fgets -

fgets(message,81,stdin); 
+0

非常感謝。 :) – Corerid

+1

@Corerid如果這個或任何答案已解決您的問題,請點擊複選標記,考慮[接受它](http://meta.stackexchange.com/q/5234/179419)。這向更廣泛的社區表明,您已經找到了解決方案,併爲答覆者和您自己提供了一些聲譽。沒有義務這樣做。 – idmean

1
  1. 是在scanf("%d")語法有錯誤,如scanf("<format specfier>",&variable);

    所以解決方法是scanf("%d", &amount)

  2. int j;是不是一個很好的做法,之前添加變量循環。

+0

「_在C++中工作正常,不在c_中」 - 它在C99和更高版本中工作正常,因爲它提供了對混合聲明和代碼的支持。 –

+0

謝謝。我會修好它。 ;) – Corerid

+0

@CoolGuy感謝您的意見。 –

1

問題:

  1. 這裏:

    scanf("%d"); 
    

    %d需要用於存儲所掃描的數目的第二個參數(int*類型)。你可能想:

    scanf("%d", &amount); 
    
  2. 您比較一個char和這裏char*

    for(i=0;message!='\0';i++) 
    

    你可能想

    for(i = 0; message[i] != '\0'; i++) 
    

不要使用gets(),因爲它已被棄用。使用fgets代替:

fgets(message, sizeof(message), stdin); 

注意fgets消耗它message換行符並存儲(如果有空間)。

+0

哦,非常感謝。是工作! :) – Corerid