Caesar密码中的C源代码错误

Caesar密码中的C源代码错误,c,caesar-cipher,cs50,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) {

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

#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++;
    }
}
#包括
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
char-ptext[40];
int i=0;
如果(argc!=2)
{
printf(“无效密钥”);
返回1;
}
其他的
printf(“输入纯文本”);
ptext=GetString();
int key=atoi(argv[1]);
int n=strlen(ptext);
while(ptext[i]!='\0')
{
如果(ptext[i]>65&&ptext[i]97&&ptext[i]两件事:

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

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


如果在
if(ptext[i]>65&&ptext[i]Change
char-ptext[40];
改为
char*ptext;

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


访问完字符串内容后,请执行
free(ptext);
释放所用内存。

char ptext[40]“<代码> >应该是代码> char *pTrase:<代码> >还是代码>字符串pTrase:< /Cord>属性属性> Sudio?这是C还是C++?IdMyRead这里应该是不同的。@ PaulMcKeZi:是C99中的一个限制,C99被删除了。但是,是的,这应该是C或C++的标记。注:<代码> int d= C + 26;< /C>当然是错误的。也许<代码> int d =((c-'a'+26)%26+'a';
你当然是想用
int c=(ptext[i]-'a'+key)%26+'a';printf('c',c')加上
'a'
)是的,谢谢,或者在下一行中使用
int d=c+'A';
。事实上,这是另一个需要解决的问题。事实上,我建议完全删除
d
的声明,因为它是无用的。无论是否使用ASCII,都可以使用
'A'
,这使代码在这两种情况下都更易于阅读。(然而,
'A'
'Z'
在某些其他字符集中是不连续的!)改变了OT,但仍然:对于非连续编码-不仅对奇怪的编码有用,例如
A..Z
不是,而且对不小心在代码页(或者实际上,在Unicode本身)中无序存储的字母表也有用-,您可以创建一个静态字符串,其中包含按正确顺序排列的所有字符。我做了建议的更改。现在编译时,它不会显示任何错误,但会在结果中显示问号,代替每个加密文本以及分段错误(核心转储).这意味着什么?首先要学习如何调试。你应该能够自己找出哪条线路有SEGFULT以及变量是什么