我真的是编码的新手,我一直在教自己如何使用edx.org编码。本周,我一直在研究密码学,我必须创建一个Vigenère的密码。我编写了代码,在大多数情况下,这是正确的。但是,当我编译该程序时,它显示了一个细分错误。我一直在努力弄清我们为什么会发生这种情况,并且完全被困。你能看一下我的代码,告诉我怎么了?
#include <stdio.h>
#include <stdlib.h>
#include <cs50.h>
#include <string.h>
#include <ctype.h>
int index(int k, int c);
int main (int argc, string argv[1])
{
//check for correct criteria
if (argc = 2, isalpha(argv[1]))
{
string text = GetString();
string key = argv[1]; //store key word
int Totalshift = strlen(key); //number of shift for keyword
int shift = 0;
//loops over the whole text
for (int i = 0, n = strlen(text); i <n; i++ )
{
char p= text[i];
char k = toupper(key[shift]); //Upper case for each character
if (isupper(p))
{
//convert to 0 index
p = p - 65;
k = k - 65;
int crypt= index (k , p);
printf("%c", crypt+65);
shift= (shift+1) %Totalshift;
}
else if (islower(p))
{
p = p - 97;
k = k - 65;
int crypt= index (k , p);
printf("%c", crypt+97);
shift= (shift+1) %Totalshift;
}
else
{
printf("%c", p);
}
}
printf("n");
}
//error message
else
{
printf("ERROR!n");
return 1;
}
}
//index function
int index(int k, int p)
{
return (k+p)% 26;
}
string
no。 永远不要隐藏指针。
int main(int argc, char ** argv)
然后:
//check for correct criteria
if (argc = 2, isalpha(argv[1]))
在这里,您分配到变量(参数在这方面的局部变量的行为)值2
,从而破坏了先前的值(该值保留了对程序给出的参数数量)。结果是分配的值,因此2
。然后,有一个逗号操作员:您丢弃该 2
,然后致电isalpha(argv[1])
,这清楚地说明了您>为什么应始终打开警告 and >从不,永远不要隐藏pointers :p> argv[1]
是类型char *
,因此a Pointer to to to to carture Array(或者,如我们所知,在这种情况下是用' '
终止的字符阵列,称为A c String c String )。由于isalpha
将int
作为参数,因此将指针("内存地址")的值隐式转换为(可能很大)int
值。从上面的链接引用,重点是我的:
c参数是一个int,应用程序应确保可表示为无符号字符或等于宏观eof的值的值。如果参数具有其他值,行为是未定义的。
可能是分割故障的来源。
最后,GetString
对我来说真的很富有。假设它分配了一些内存(大概是从用户读取的字符串)...您 free 该内存在哪里?是真的分配内存,还是将指针返回具有自动存储持续时间的数组(可以说是本地变量)?