CS50 PSet 2:Vigenere 密码分段错误
Posted
技术标签:
【中文标题】CS50 PSet 2:Vigenere 密码分段错误【英文标题】:CS50 PSet 2: Vigenere cipher Segmentation Fault 【发布时间】:2015-08-12 16:20:43 【问题描述】:我是这个主题的新手。我尝试自己调试,但是 Segmentation Fault Core dumped 出现了,我不知道为什么。有人可以帮帮我吗?
# include<cs50.h>
# include<stdio.h>
# include<ctype.h>
# include<string.h>
int main(int argc, string argv[])
int i, n, no;
string s;
string vige = NULL;
string msg;
s= argv[1];
for (i = 0; n = strlen(s), i < n ; i++)
if (argc != 2 || (!isalpha(s[i]) ))
printf("Error \n");
return 1;
printf("Secret message: ");
msg = GetString();
for(i = 0; i < strlen(s) ; i++)
if(isupper(s[i]))
vige[i] = s[i] - 65;
else if(islower(s[i]))
vige[i] = s[i] - 97;
for(i = 0; no = strlen(msg), i < no; i++)
if(isalpha(msg[i]))
if(islower(msg[i]))
printf("%c", (msg[i] + (vige[i] % n)) + 97) ;
else if(isupper(msg[i]))
printf("%c", (msg[i] + (vige[i] % n)) + 65) ;
else
printf("%c", msg[i]);
return 0;
如果有其他错误,我会自己解决,但是Segmentation fault超出了我的理解。
【问题讨论】:
gdb
说什么?
s= argv[1];
如果我运行像./a.out
这样的二进制文件会怎样?然后,isalpha(s[i]
....
先把for (i = 0; n = strlen(s), i < n ; i++)
改成for (i = 0, n = strlen(s); i < n ; i++)
@EugeneSh。或者,只是一个选项,将n = strlen(s);
完全移出for
循环语句。
实际上发生了两次。
【参考方案1】:
vige
被初始化为NULL
,但后来它使用索引符号vige[i]
取消引用,这是试图访问代码不拥有的内存,导致内存冲突和未定义的行为。
【讨论】:
以上是关于CS50 PSet 2:Vigenere 密码分段错误的主要内容,如果未能解决你的问题,请参考以下文章