我已经尝试修复此源代码很长时间了,但是编译器仍然显示错误。

#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

最佳答案

几件事情:

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

int c= (ptext+key)%26;行处,您似乎正在尝试处理ptext[i]。也许您忘记了包括索引器?

只是一个建议,如果使用ASCII,则在if( ptext[i]>65 && ptext[i]<90)这样的行中,您可以自己使用char值而不是数字,这样就不必研究ASCII表。您可以这样操作:if(ptext[i] >= 'A' && ptext[i] <= 'Z')

同样,在上面的通知中,我将比较器><更改为>=<='A''Z'不是有效字符吗?

照原样使用模时,对于凯撒密码,您需要字母中字符的索引。因此,如果是大写字母,您要像这样减去'A'(或者您很清楚地知道,ASCII中为65):`int c =(ptext [i]-'A'+ key)%26; '。

关于c - 凯撒密码中的C源代码错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25432630/

10-10 08:01