-3

我一直在尝试修复此源代码,但编译器仍然显示错误。

#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.

4

2 回答 2

1

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

GetString()from 函数cs50.h动态分配一些内存并返回一个指向它的指针。在 C 中,不能分配给数组,也不能返回数组。

完成对字符串内容的访问后,free(ptext);释放所使用的内存。

于 2014-08-21T20:21:50.190 回答
1

几件事:

你真正需要ptext的是一个char*,而不是一个数组。我猜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;'。

于 2014-08-21T19:34:36.073 回答