我正在尝试使用命令行参数并将其读入数组,但是编译器给了我这个错误:
错误:无效的初始化程序
我知道我需要使用 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/