【问题标题】:C - argv stores random values instead of given onesC - argv 存储随机值而不是给定值
【发布时间】:2017-10-19 08:41:32
【问题描述】:

程序应该接受三个命令行参数,其中第一个是算术操作数,第二个和第三个数字应该应用操作数 该程序将打印随机值。

#include <stdio.h>

int main (int argc, int *argv[])
{
  switch ( (char) * argv[1] )
  {
    case '+' : printf("%d", *argv[2] + *argv[3] );
  }

  return 0;
}

另外,我应该如何获取不同数据类型的命令行参数?使用类型转换是否正确?

【问题讨论】:

  • int *argv[] ==> char *argv[].
  • int main (int argc, int *argv[]) ---> int main(int argc, char *argv[])
  • %d 格式说明符打印数字,而 argv[x] 是字符串....

标签: c command-line argv


【解决方案1】:
#include <stdio.h>
#include <stdlib.h>

int main (int argc, char *argv[])
{
  if ( argc > 3 )
  {
    switch ( *argv[1] )
    {
       case '+' : 
          printf("answer: %d\n", atoi(argv[2]) + atoi(argv[3])  );
          break;
       default :
          printf("ERROR: operand %c invalid\n",*argv[1]);
    }
  }
  else 
  {
     printf("ERROR: you must enter operator, plus two operands. e.g.:\n");
     printf("%s + 3 2\n",argv[0]);
     return 1;
  }
}

【讨论】:

  • 谢谢,我不知道那个“atoi”函数
  • strtol 提供了更大的灵活性,因为它实际上可以告诉您整个字符串是否被转换为整数
  • @LPs 您需要将 C 字符串转换为整数,以便可以添加它们。然后打印整数结果。
【解决方案2】:

正如其他人所提到的,参数作为字符串数组读入argv。因此您必须使用char *argv[]。从字符串到整数的转换由atoi 执行。只需将字符转换为整数即可获得该字符的 ASCII 表示。

#include <stdio.h>
#include <stdlib.h>

int main (int argc, char *argv[])
{
    switch ( *argv[1] )
    {
        case '+':
            printf("%d\n", atoi(argv[2]) + atoi(argv[3]) );
            break;
    }

    return 0;
}

要获得浮点运算,请将%d 替换为%f 并将atoi 替换为atof。

当然,您还应该添加健全性检查。至少,您应该检查argc 以防止读取未初始化的空间。见 cmets。

【讨论】:

  • 我告诉用char *argv[] 替换int *argv[] 但在我自己的示例中显然忘记了这样做。显然我应该得到-1。已更正。
  • 不是拒绝投票者,但您必须在访问argv 元素之前检查argc 值:否则UB 就在拐角处....
  • 我猜你也应该#include &lt;stdlib.h&gt;
  • @LPs UB 是什么?
【解决方案3】:
#include<stdio.h>
#include<stdlib.h>

int main(int argc, char *argv[]) {
  if(argc != 4) {
    printf("Error message");
    printf("USAGE: ./a.out <operand> <number1> <number2>");
    return 0;
  }
  switch(*argv[1]) {
    case '+':
      printf("%d", (atoi(argv[2])+atoi(argv[3])));
      break;
    default:
      printf("Enter valid operand");
  }
}

【讨论】:

    猜你喜欢
    • 2016-06-05
    • 1970-01-01
    • 1970-01-01
    • 2020-12-16
    • 2021-05-29
    • 2015-02-10
    • 1970-01-01
    • 1970-01-01
    • 2015-04-07
    相关资源
    最近更新 更多