代码之家  ›  专栏  ›  技术社区  ›  Drin Kurtishi

cs50在线课程中凯撒问题集的问题

  •  0
  • Drin Kurtishi  · 技术社区  · 2 年前

    我正处在这样一个阶段,我们需要正确地设置命令行参数,使其只接受数字,并在用户键入数字以外的任何内容时中断代码。(留空、输入两位数、输入文本、输入两段文本等)

    因此,如果用户键入多个命令行参数或一个不是数字的命令行参数,我使程序正常工作。我的问题是,如果我将命令行参数留空,程序会给我一个分段错误,如果我键入像“1d”这样的单个命令行,它将无法正常工作。谁能告诉我哪里出了问题?我卡住了。以下是代码:

    #include <cs50.h>
    #include <stdio.h>
    #include <ctype.h>
    #include <string.h>    
        
    bool only_digits(string argv[]);
    int main(int argc, string argv[])
    {
        bool digits = only_digits(argv);
        if(argc != 2 || digits == false)
        {
            printf("Usage: ./caesar key\n");
            return 1;
        }
        else
        {
            return 0;
        }
    }
    bool only_digits(string argv[])
    {
        bool digit = false;
        for(int i = 0; i < strlen(argv[1]); i++)
        {
            if(isdigit(argv[1][i]))
            {
                digit = true;
            }
        }
        return digit;
    }
    

    Here are all my inputs

    1 回复  |  直到 2 年前
        1
  •  1
  •   Barmar    2 年前

    你有两个问题:

    1. 你在打电话吗 only_digits() 在检查是否 argv[1] 存在。因此,如果没有命令行参数,就会出现segfault。打电话解决这个问题 只有_位() 之后 argc 检查
    2. 中的条件 只有_位() 这是倒退。它回来了 true 如果任何字符是数字,但它应该返回 符合事实的 只有 全部的 字符是数字。
    #include <cs50.h>
    #include <stdio.h>
    #include <ctype.h>
    #include <string.h>
        
    bool only_digits(string argv[]);
    
    int main(int argc, string argv[])
    {
        if(!(argc == 2 && only_digits(argv)))
        {
            printf("Usage: ./caesar key\n");
            return 1;
        }
        return 0;
    }
    
    bool only_digits(string argv[])
    {
        for(int i = 0; i < strlen(argv[1]); i++)
        {
            if(!isdigit(argv[1][i]))
            {
                return false;
            }
        }
        return true;
    }