2015-09-27 65 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