cs50网课上的凯撒题集问题

Problem with the Caesar problem set on cs50 online course

我正处于需要正确设置命令行参数以仅接受数字并在用户键入除数字以外的任何其他内容时中断代码的阶段。 (留空、输入两位数、输入文字、输入两段文字等)

因此,如果用户键入多个命令行参数或一个不是数字的命令行参数,我可以使程序正常工作。我的问题是,如果我将命令行参数留空,程序会出现分段错误,如果我键入单个命令行(如“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;
}

你有两个问题:

  1. 您在检查 argv[1] 是否存在之前调用 only_digits()。所以如果没有 command-line 参数,你会得到一个段错误。通过在 argc 检查后调用 only_digits() 来解决这个问题。
  2. only_digits()中的条件是倒退的。它 returns true 如果任何字符是数字,但它应该 return true 仅当 all 字符是数字时.
#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;
}