为啥我在 C 中收到警告“分段错误,核心转储”
Posted
技术标签:
【中文标题】为啥我在 C 中收到警告“分段错误,核心转储”【英文标题】:Why am I getting a warning 'Segmentation fault, core dumped' in C为什么我在 C 中收到警告“分段错误,核心转储” 【发布时间】:2014-02-11 16:10:43 【问题描述】:我正在编写一个将纯文本加密为密文的程序。当我去运行我的程序时,我收到一个分段错误,核心转储错误。
这是我的代码:
#include <stdio.h>
#include <cs50.h>
#include <string.h>
#include <ctype.h>
int main(int argc, string argv[])
int k = 0;
// continues the program if 2 and no more than 2 command line arguments exist and argv[1] contains alphabetical characters only
if(argc == 2 && argc == isalpha(argv[1]))
k = atoi(argv[1]);
// re-prompts user to enter only 2 command line arguments and the second should consist of only alphabetical characters
else
printf("You must enter a command line argument using only alphabetical characters!\n");
return 1;
string text = GetString();
int cipher;
int key;
// loops through each charcter in key and gives each character a valule to add to plain text
for (int j = 0, n = strlen(argv[1]); j < n; j++)
if (isalpha(argv[1][j]))
if (isupper(argv[1][j]))
key = 26 - (91 - argv[1][j]);
else
key = 26 - (123 - argv[1][j]);
else
key = argv[1][j];
// loops through plaintext entered by user and changes text to ciphertext according to key
for (int i = 0, l = strlen(text); i < l; i++)
if (isalpha(text[i]))
cipher = (text[i] + key) % n;
printf("%c", cipher);
else
printf("%c", text[i]);
printf("\n");
【问题讨论】:
我只是好奇:这个代码段实际上是在没有错误的情况下构建的,而 main 被声明为int main(int argc, string argv[])
吗? (正如hacks所说,C中没有string类型)
if(argc == 2 && argc == isalpha(argv[1]))
含义未知
是的,这是我正在学习的在线课程。 cs50.h 为学生提供了一个字符串类型。我不知道他们为什么会这样做,考虑到 C 中不存在字符串类型
尝试至少做printf debugging
找出此分段错误发生在哪里,然后然后向我们寻求帮助。
@ryyker: string
这是 cs50 标头中的 typedef (typedef char * string
)。对 OP:GetString
在某些情况下返回NULL
......也要检查一下。另外:如果可能,请避免使用 string
类型:GetString
在堆上分配内存,所以如果你玩完了,最好不要使用 free
-ing 指针。
【参考方案1】:
目前也在学习这个确切的教程并遇到了同样的错误。我认为问题在于您在字符串上使用 isalpha(argv[1]) 而我认为 isalpha 仅适用于单个字符。我最终使用了一个 for 循环,使用 argv[1][i] 逐个字符地遍历 argv[1] 关键字。
对此非常陌生,所以我希望我没有把你引向错误的方向。
【讨论】:
【参考方案2】:int main(int argc, string argv[])
应该是
int main(int argc, char *argv[])
C 中没有string
数据类型。您的编译器应该发出警告。在您下载并链接到project cs50.c file 之前,cs50.h
将无法使用。
另外,isalpha
需要 int
类型的参数,但在您的 if
的条件下
if(argc == 2 && argc == isalpha(argv[1])) ...
您正在传递一个指向字符串的指针,这是错误的。
AsElias Van指出Getstring
在堆上分配内存,使用后需要释放指针。
【讨论】:
它甚至是这样构建的令人怀疑。 cs50.h 有(无论出于什么奇怪的原因)typedef char* string;
这个神秘的<cs50.h>
类型定义string
(无论如何都是保留标识符)很有可能是char *
,这是愚蠢的混淆。
我的意思是,这是最小的问题。在这段代码中甚至很难发现一个“正确”的行:(
可能值得在此答案中添加GetString
函数分配堆内存,因此使用此库的人可能不知道这一事实,并且无法@ 987654338@ 使用他们的 "string" 后的内存 (cf source of cs50.c here)【参考方案3】:
尝试遍历 argv[1] 以访问组成字符串的字符,即 argv[1][s]。
然后在实际字符上单独使用 isalpha,即 isalpha(argv[1][s]),而不是在整个字符串上使用它。
我使用以下函数来执行此任务
// if checker returns 0 then it's all alphabet
int checker(string key)
for(int i = 0, len = strlen(key); i < len; i++)
if(isalpha(key[i]) == 0)
return 1;
return 0;
【讨论】:
以上是关于为啥我在 C 中收到警告“分段错误,核心转储”的主要内容,如果未能解决你的问题,请参考以下文章