【问题标题】:Reading command-line argument in C and checking is it a digit在 C 中读取命令行参数并检查它是否为数字
【发布时间】:2021-02-28 10:37:40
【问题描述】:

关于我的目标的详细信息

在 C 语言中,我的程序应该从命令行获取输入,读取它,确保它是一个数字,如果为真则打印出“成功”,如果为假则打印出“用法:./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;
   }

【问题讨论】:

    标签: arrays c command-line-arguments cs50


    【解决方案1】:

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

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

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

    【讨论】:

    • 我真的很喜欢你的回答,简洁明了。但是,唯一的问题是像“-----”这样的值将被视为有效数字。
    • @dreamcrash 我同意!这样的案例会失败。我将编辑我的答案以包含它。
    【解决方案2】:

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

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

    例如,"-----" 之类的值将被视为有效数字

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

        ...
        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”不是数字

    【讨论】:

      【解决方案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

      【讨论】:

      • string 是哈佛 CS50 课程中char *typedef。请参阅tag info for CS50
      • 我仍然不明白他们为什么不只使用 char * 但是,我知道什么,我是初学者。
      猜你喜欢
      • 2015-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-15
      • 2011-04-21
      • 1970-01-01
      • 2017-04-11
      相关资源
      最近更新 更多