为啥我在 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 &amp;&amp; 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; 这个神秘的&lt;cs50.h&gt; 类型定义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 中收到警告“分段错误,核心转储”的主要内容,如果未能解决你的问题,请参考以下文章

为啥我得到分段(核心转储)?

为啥写作主要;在 C 中给出一个段错误

在opencv c ++中查找图像卷积时出现分段错误(核心转储)错误

为啥我的代码中出现分段错误(核心转储)错误?

分段错误:核心转储

什么原因导致C中出现分段错误(核心转储)?