在 C 中读取命令行参数并检查它是否是数字

Reading command-line argument in C and checking is it a digit

提问人:Nermin 提问时间:11/17/2020 最后编辑:JabberwockyNermin 更新时间:12/5/2020 访问量:419

问:

关于我的目标的详细信息

在 C 中,我的程序应该从命令行获取输入,读取它,确保它是一个数字,然后打印出“成功”(如果为 true),如果为假,则打印出“Usage: ./caesar key”。

预期结果

./caesar 33
Success

./caesar zzz
Usage: ./caesar key

实际结果

./caesar 33
Segmentation error

我试过什么

 int main (int argc, string argv[])
 {
   if (argc == 2)
   {
      if (isdigit(argv[1]))
      {
        printf("Success\n");
        return 0;
      }

if (argc == 2)
{
  if (isdigit(argv[0][1]))
  {
    printf("Success\n");
    return 0;
 }

int main (int argc, string argv[])
{
   if (argc == 2 && isdigit(argv[1]))
   {
     printf("Success\n");
     return 0;
   }
数组 C 命令行参数 CS50

评论


答:

5赞 Param Siddharth 11/17/2020 #1

你在这里做错了,你想检查整个字符串是否由数字组成,但你把字符串本身传递给了 ,它需要一个 .您可以做的是手动遍历数组并检查每个数组是否为数字,或者您可以使用如下所示的函数。isdigitcharcharcharstrspn

strspn(argv[1], "0123456789") == strlen(argv[1])

这将比较参数中的数字范围,如果它与字符串本身的长度相同,则返回 true。如果要在参数中允许 + 和 - 符号,请使用 inside ,尽管这会导致像这样的情况(如下面的@dreamcrash所述)的误报,这就是为什么定义自定义函数始终是更好的选择。和 函数在标头中都可用。"-+0123456789"strspn+++++strspnstrlenstring.h

评论

1赞 dreamcrash 11/17/2020
我真的很喜欢你的回答,干净而简单。但是,唯一的问题是像“-----”这样的值将被视为有效数字。
0赞 Param Siddharth 11/18/2020
@dreamcrash 我同意!这种情况会失败。我将编辑我的答案以包括这一点。
2赞 dreamcrash 11/17/2020 #2

如果您不需要使用该函数,那么您可以按照 @Param Siddharth 的建议使用 strspn 函数。但是,它们是使用isdigit

if (strspn(string, "-+0123456789") == strlen(string))

例如,值 like 将被视为有效数字"-----"

如果你想使用这个函数,你需要遍历 String 中的所有 s(而不是一次性传递整个 String),并检查它们中的每一个是否确实是一个数字:isdigitchar

    ...
    int i, is_number = 1;
    for (i = 0; is_number && argv[1][i] != '\0'; i++){
        if(i == 0 && (argv[1][i] == '-' || argv[1][i] == '+')){
           continue;
        }   
        is_number = isdigit(string[i]);
     }
     // It should fail for Strings that are : empty, only "-" or "+"
    if(i == 0 || (i == 1 && !isdigit(argv[1][0])) || !is_number){
        printf("The String is not a Number \n");
        return 1;
     }
     printf("Success\n");
     return 0;
}

我用输入进行了测试:

  • “-”,不是数字
  • “”,而不是数字
  • “-1”,数字
  • “+1”,数字
  • “+1+1”不是数字
1赞 Krishna Kanth Yenumula 11/17/2020 #3
int main (int argc, string argv[])

string 数据类型未在 C 语言中定义。第二个参数应该是 。char* argv[]

请看答案:https://stackoverflow.com/questions/14709323/does-c-have-a-string-type#:~:text=There%20is%20no%20string%20type,one%20additional%20zero%20terminating%20character

评论

1赞 user3386109 11/17/2020
string是哈佛大学 CS50 课程中的一门。请参阅 CS50 的标记信息typedefchar *
1赞 Nermin 11/17/2020
我仍然不明白为什么他们不只使用 char *,但是,我知道什么,我是初学者。