Cesar密码中的C源代码错误

时间:2014-08-21 17:41:44

标签: c caesar-cipher cs50

我一直试图修复此源代码很长一段时间但编译器仍显示错误。

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

int main(int argc, char* argv[])
{
    char ptext[40];
    int i=0;
    if(argc!=2)
    {
        printf("invalid key");
        return 1;
    }
    else
        printf("enter plain text\n");
    ptext= GetString();
    int key= atoi(argv[1]);
    int n=strlen(ptext);
    while( ptext[i]!= '\0')
    {
        if( ptext[i]>65 && ptext[i]<90)
        {
            int c= (ptext+key)%26;
            int d= c+26;
            printf("%c", d);
        }
        else if( ptext[i]>97 && ptext[i]<122)
        {
            int c= (ptext+key)%26;
            int d= c+26;
            printf("%c", d);
        }
        else
        {
            printf("%c",ptext[i]);
        }
        i++;
    }
}

编译时显示的错误为array type 'char [40]' is not assignable(即使输入的数字小于40或括号为空,也不会执行任何操作)和invalid operands to binary operation int c = (ptext+key)%26

2 个答案:

答案 0 :(得分:1)

一些事情:

您真正需要的ptextchar*,而不是数组。我猜GetString()会返回一个字符串,或char[] / char*你有什么。根据{{​​1}}的工作方式,您可能需要测试GetString()返回。

NULL行显示您正在尝试处理int c= (ptext+key)%26;。也许你忘了包括索引器?

只是一个建议,如果使用ASCII,在ptext[i]这样的行,您可以使用if( ptext[i]>65 && ptext[i]<90)值本身而不是数字,这样您就不必查看ASCII表。您可以这样做:char

另请注意,我将比较器if(ptext[i] >= 'A' && ptext[i] <= 'Z')>更改为<>=。不是<='A'有效字符吗?

当您使用模数时,对于Caesar Cipher,您需要字母表中的字符索引。因此,如果它是大写字母,你想减去'Z'(或者如你所知,在ASCII中为65),如下所示:`int c =(ptext [i] - 'A'+ key)% 26;”

答案 1 :(得分:1)

char ptext[40];更改为char *ptext;

来自GetString()的{​​{1}}函数动态分配一些内存并返回指向它的指针。在C中,不能分配给数组,也不能返回数组。

完成对字符串内容的访问后,请cs50.h释放使用的内存。