【问题标题】:Reading numbers from command line in c从c中的命令行读取数字
【发布时间】:2014-10-06 15:51:04
【问题描述】:

假设我有一个变量:

char variableName[256];

如果我得到一个数字列表,如10 11 12 .. 等,我如何存储来自命令行的输入。我正在使用

fgets(variableName, sizeof(variableName), stdin)

并将其直接转换为 (1,0,1,1, 等),而不是在空格之间转换为 (10, 11, 12, 等)。

我是否应该使用scanf,并基于空白存储;只是不确定语法/什么是常见的?

谢谢大家!

【问题讨论】:

  • fgets 不会删除空格。你能给出一些示例代码和你的意见吗?
  • "...它直接变成(1,0,1,1等)..."请详细说明。只有1和0吗?它用逗号替换空格?
  • 嘿,好吧!所以如果我输入 30, 4, 10 char variableName[256];将其存储为 (3, 0, 4, 1, 0),因此它不仅存储 1 和 0。我试图让它按原样存储(30、4、10)。谢谢!
  • 向我们展示如何“从命令行”调用程序。

标签: c command-line integer


【解决方案1】:

如果你知道要输入多少个数字,那么在使用fgets后使用sscanf或直接使用scanf(不推荐)

  int var[NO_OF_INPUTS];
  fgets(variableName , sizeof variableName , stdin);
  sscanf(variableName , "%d %d %d ... %d" , &var[0] , &var[1] , ... , &var[NO_OF_INPUTS - 1]);

如果您不知道输入的数量,那么您可以创建一个函数,通过计算fgets 之后的空格数来计算输入的数字数量,然后可以使用strtok 在空格和strtol 之间跳转将其转换为数字

【讨论】:

  • 我正在使用它,只是得到一个核心转储;不过感谢您的建议!
  • 哪一个,strtoksscanf
  • 哦,是的,我忘了&愚蠢的错误,现在试试
  • 确保在使用fgets后从variableName的末尾删除\n
【解决方案2】:

如果您从命令行获取值,那么您只需使用argcargvstrtol 即可完成这项工作。无需创建新变量!

argc 包含传递给程序的命令行参数的数量。

argv 是参数数组。

我希望这段代码会有所帮助:

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

int main(int argc, char *argv[])
{
    int i;
    char *p;
    long int li_arr[argc];
    if (argc==1)
    {
        puts("No arguments provided");
        exit(1);
    }
    for(i=1;i<argc;i++)
    {
        li_arr[i] = strtol(argv[i],&p,10);
        printf("%ld\n",li_arr[i]);
    }
    return 0;
}

【讨论】:

    【解决方案3】:

    您不必调用 fgets 或任何其他函数,因为传递给程序的参数在 argv[] 数组中。您可以直接访问它们

    int i = atoi( argv[1]);
    

    但最好使用提供错误检查的sscanf

    if ( sscanf ( argv[1], "%d", &i) != 1) { printf ( "error - not an integer"); }
    

    strtol() 防止下溢/溢出:

    char *endptr, *str;
    str = argv[1];
    long val = strtol( str, &endptr, 10);
    

    http://linux.die.net/man/3/sscanf

    【讨论】:

    • 这也是我怀疑 OP 的意思,但是她是如何从stdin 那里收到“1,0,1,1 等”(不管是什么)?
    • @mafso OP 误导性地尝试使用标准输入,而他只需要使用 argv[]
    • atoi()sscanf("%d") 都有未定义的溢出行为。使用strtol()
    • @DOWNVOTER 请问您为什么投了反对票?