编码 Vigenère 密码时 c 中的分段错误
Posted
技术标签:
【中文标题】编码 Vigenère 密码时 c 中的分段错误【英文标题】:segmentation fault in c while coding Vigenère’s cipher 【发布时间】:2016-06-21 20:42:40 【问题描述】:我对编码真的很陌生,我一直在自学如何使用 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;
【问题讨论】:
【参考方案1】:string
不。 永远不要隐藏指针。
int main(int argc, char ** argv)
然后:
//check for correct criteria
if (argc = 2, isalpha(argv[1]))
在这里,您将值2
分配给变量(参数在这方面的行为类似于局部变量),从而破坏了先前的值(它保存了给程序的参数数量) .结果是分配的值,即2
。然后是comma operator:你丢弃那个2
,然后调用isalpha(argv[1])
,这清楚地说明了为什么你应该总是打开警告和永远,永远隐藏指针强>:
argv[1]
是char *
类型,因此是一个指向字符数组的指针(或者,在这种情况下,我们知道以'\0'
结尾的字符数组,称为C 字符串)。由于isalpha
takes an int
as parameter 指针的值(“内存地址”)被隐式转换为(可能非常大)int
值。引用上面的链接,强调我的:
c 参数是一个 int,应用程序应确保其值可表示为无符号字符或等于宏 EOF 的值。如果参数有任何其他值,行为未定义。
这可能是分段错误的来源。
最后,GetString
在我看来真的很可疑。假设它分配了一些内存(对于它可能从用户读取的字符串)......你在哪里释放该内存?它真的是在分配内存,还是可能返回一个指向具有自动存储持续时间的数组的指针(可以说是一个局部变量)?
【讨论】:
谢谢丹尼尔。我很感激你的回答。 GetString 和字符串都来自上面提到的 CS50 库。您提到的操作员和 getalpha 的问题解决了这个问题。现在程序运行正常。以上是关于编码 Vigenère 密码时 c 中的分段错误的主要内容,如果未能解决你的问题,请参考以下文章