【问题标题】:CS50 PSET-2 Caesar segmentation faultCS50 PSET-2 凯撒分段错误
【发布时间】:2020-08-02 23:02:01
【问题描述】:
#include <cs50.h>
#include <stdio.h>
#include <stdlib.h> //covert str into int atoi()
#include <ctype.h> // isalpha(), isdigit() etc.
#include <string.h> //strlen() etc.


int main(int argc, string argv[])
{
    // convert argv[1] into int
    int key = atoi(argv[1]);
    // if input is 2 command lines and argv > 0 and there is no alphabet n shit in argv[1] we good to go
    if (argc == 2 && key > 0 && isdigit(argv[1])) 
    {
        //ask for input to chiper
        string plain = get_string("Plaintext: ");
        int len_plain = strlen(plain);
        // check each char in string plain
        for (int i = 0; i < len_plain; i++)
        {
            // if its from 'a' to 'z' add number of key
            if (plain[i] >= 'a' && plain[i] <= 'z')
            {
                char cipher = (plain[i] + key) % 26;
                printf("%c", cipher);
                return 0;
            }
        }

    }
    else
    {
        printf("Usage: ./caesar kay");
        return 1;
    }
}

运行此代码时,我遇到了分段错误。我做错了什么?我已经在这段代码上工作了几天,但我无法让它工作。

【问题讨论】:

  • 不是每个试图回答这个问题的人都可以访问cs50.h。你能请吗?从代码中删除该依赖项。另外,isdigit 的参数不应该是一个字符吗? (即isdigit(argv[1][0])
  • 编译器应该会告诉您您将不正确的参数类型输入到isdigit。打开警告并处理它们。

标签: c segmentation-fault cs50


【解决方案1】:

这个isdigit(argv[1]) 给出了一个段错误。 isdigit 的函数签名(来自手册页):

int isdigit(int c);

但是,argv[1](如果存在的话!)是一个字符串。建议您遵循规范

  1. 验证命令行参数的正确数量是 输入了
  2. 检查所述参数中的每个字符是否为十进制数字

只有这样,您才能确信atoi 将提供所需的结果。

【讨论】: