是啥导致发生分段错误?
Posted
技术标签:
【中文标题】是啥导致发生分段错误?【英文标题】:What is causing Segmentation error to occur?是什么导致发生分段错误? 【发布时间】:2016-12-11 12:48:16 【问题描述】:如上运行程序显示分段错误。为什么会这样? 该程序适用于 vigenere cipher 。我正在做的是将密钥存储在一个字符串中,然后像我们以前在凯撒密码中所做的那样存储密钥的整数值,然后实现 vigenere 密码,但是如果我编译它然后使用 ./a.out,它会以某种方式显示分段错误熏肉。我无法弄清楚为什么会发生(导致分段错误的原因)。
#include<stdio.h>
#include<cs50.h>
#include<string.h>
#include<ctype.h>
#include<stdlib.h>
int main(int argc, string argv[])
if((argc==2)&&(isalpha(argv[1])))
string k;
k=argv[1];
string p = GetString();
int lenkey=strlen(k);
int lenp=strlen(p);
string c="hello";
char temp;
//change key to lowercase and store the shift value as in caesar
for(int i=0;i<lenkey;i++)
temp=tolower(k[i]);
k[i]=temp -'a';
int j=0;
for(int i=0;i<lenp;i++)
//i is for plaintext j is for key
if(isalpha(p[i]))
j++;
if(j==(lenkey-1)) j=0;//reset the key if end is reached
if(isupper(p[i]))
p[i] = p[i]-'A';
c[i] = (p[i]+k[j])%26;
c[i] = c[i]+'A';
if(islower(p[i]))
p[i] = p[i]-'a';
c[i] = (p[i]+k[j])%26;
c[i] = c[i]+'a';
else
c[i]=p[i];
printf("%s\n",c);
return 0;
else
printf("what?\n");
return 1;
【问题讨论】:
string
?我假设它在cs50.h
中,因为它不存在于任何其他(标准)标题中。所以你的代码可以,从字面上看,可以做任何事情!
string
是 typedef char* string
,它位于 cs50
头文件中
好的,那么GetString()
会给你什么?
GetString()
从用户那里获取输入并存储在字符串中
【参考方案1】:
关于atoi
:“返回将输入字符解释为数字所产生的 int 值。如果输入不能转换为该类型的值,则返回值为 0。”
所以您的atoi(c) -'a'
将失败并产生一个负数(c
是字符串“hello”,不能解释为数字)。
你的意思可能是:
temp=tolower(k[i]);
k[i]=temp -'a';
以下也可能是错误:
for(int i=0;i<lenp;i++)
...
c[i] = c[i]+'A';
因为i<lenp
但它必须小于c
的长度,即5。
除此之外,char *c="hello"
使 c 成为常量字符串(文字),您不能修改文字。因此:段错误。使用:
char c[]="hello";
(所有人,包括老师:放弃string
!它让所有人感到困惑!)
【讨论】:
使用调试器检查哪里崩溃了。错误可能不止这一个。以上是关于是啥导致发生分段错误?的主要内容,如果未能解决你的问题,请参考以下文章