【问题标题】:CS50 Problem Set 2--Segmentation fault (core dumped)CS50问题集2--Segmentation fault (core dumped)
【发布时间】:2022-11-22 18:32:25
【问题描述】:

所以我已经在这段代码上工作了大约一天,并最终成功地创建了文件而没有弹出错误消息。但是,一旦我运行它,就会弹出:

分段错误(核心已转储)

`

#include <cs50.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, string argv[])
{
    int k=atoi(argv[1]);
    if (argc!=2)
    {
        printf("Usage: ./caesar key\n");
        return 1;
    }
    else if (argv[1]<0)
    {
        printf("Usage: ./caesar key\n");
        return 2;
    }
    else if (argv[1]== NULL)
    {
        printf("Usage: ./caesar key\n");
        return 3;
    }
    string plaintext= get_string("plaintext: ");
    printf("ciphertext: ");
    for(int i=0; i<strlen(plaintext); i++)
    {
            if(plaintext[i]>='a' && plaintext[i]<='z')
            {
                printf("%c", ((plaintext[i]-97+k)%26)+97);

            }
            else if(plaintext[i]>='A' && plaintext[i]<='Z')
            {
                printf("%c", ((plaintext[i]-65+k)%26)+65);
            }
    }
    printf("\n");
}

` 谁能告诉我我在这里做错了什么?

还没有真正尝试过任何方法来解决这个问题。

【问题讨论】:

  • 首先要做的是在调试器中运行它,找出它在哪一行崩溃。

标签: c encryption cs50 caesar-cipher


【解决方案1】:

即使没有看到核心转储的位置,我也能看到代码中的许多问题。

第一件事是在检查有多少参数之前尝试取消引用argv[1]。 IE。

int k=atoi(argv[1]);

来之前

    if (argc!=2)
    {
        printf("Usage: ./caesar key
");
        return 1;
    }

如果您在运行程序时没有输入偏移值,这将导致分段错误,因为 C 运行时在指向最后一个参数的指针之后放置了一个空指针。所以如果你只是在命令行输入./caesarargc就是1,argv[1]就是NULL

这是您崩溃的最可能原因。

这一行:

else if (argv[1]<0)

真的没有任何意义。您正在将指针与 0 进行比较。在许多(所有?)实现中,指针的行为类似于比较下的无符号整数,因此没有指针小于零。

这条线

else if (argv[1]== NULL)

如果您已经检查过 argc 是两个,那么它是多余的。因为,如果argc是两个argv[0]argv[1]保证指向字符串。


在一个不相关的说明中,我会说你永远不应该做 cs50.h 头文件所做的事情,它有一个 char * 的类型定义。它只是混淆了 string 是什么。

【讨论】:

  • 它不是按照惯例, 但 C 标准需要argv[argc] == NULL
  • @iBug 我当时记错了。我已经改变了措辞。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-28
  • 1970-01-01
  • 1970-01-01
  • 2019-04-04
  • 1970-01-01
  • 1970-01-01
  • 2021-06-10
相关资源
最近更新 更多