无法将命令行参数读入整数数组 C

标签 c command-line-arguments

我正在尝试使用命令行参数并将其读入数组,但是编译器给了我这个错误:

错误:无效的初始化程序 我知道我需要使用 int main(int argc, char *argv[]) 来使用命令行参数,然后将其设置如下以读入数组:

 int arr[] = atoi(argv[1]);

不知道我错过了什么,因为这在过去一直对我有用。有什么想法吗?

最佳答案

如果您通过命令行传递一系列数字并且您想要 要将它们放在一个数组中,那么你可以这样做:

int main(int argc, char **argv)
{
    if(argc < 2)
    {
        fprintf(stderr, "not enough arguments\n");
        return 1;
    }

    int arr[argc-1];

    for(size_t i = 0; i < argc - 1; ++i)
        arr[i] = atoi(argv[i+1]);

    ...

    return;
}

之所以从 argv[i+1] 开始转换,而不是从 argv[0] 开始,是因为 argv[0] 始终包含包含执行的文件名的字符串 二进制文件(更准确地说是您在 shell 中传递了命令),所以 argc 始终至少为 1。这就是为什么 arr 的维度为 argc-1, 因为对于 n 个参数,argc 将是 n+1

还要注意 atoi 在遇到错误时表现不佳,如果 string 不是整数,那么 atoi 将返回 0 并且你不知道是否 这是转换中错误的合法数字。使用strtol是一个 更好的选择:

int main(int argc, char **argv)
{
    if(argc < 2)
    {
        fprintf(stderr, "not enough arguments\n");
        return 1;
    }

    int arr[argc-1];
    char *endptr;

    for(size_t i = 0; i < argc - 1; ++i)
    {
        arr[i] = strtol(argv[i+1], &endptr, 0);

        if(*endptr != 0)
        {
            fprintf(stderr, "The argument #%d is not a number\n", i+1);
            return 1; // error
        }
    }

    ...

    return;
}

这会给你一个更好的结果,因为它对来自 用户。

关于无法将命令行参数读入整数数组 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49267955/

相关文章:

c - 标准流管道测试失败

python - 使用 argparse 处理不定的成对参数

python-3.x - 格式化 ArgParse 帮助菜单

c - 使用 libxml2 删除 xml 中的空白

java - 指向作为 JNA 方法参数的结构数组的指针

c - 具有良好单元测试的嵌入式系统代码?

c# - 在 C# 中转义命令行参数

c - 小于(<)float与c中if语句的比较

c - 我在不使用 strlen 的情况下从命令行打印字符串长度时遇到问题?

c - 将命令行输入字符串解析为字符数组