我试图使用命令行参数并将其读入数组但是编译器却给了我这个错误:
error: invalid initializer
我知道我需要使用int main(int argc, char *argv[])
来使用命令行参数,然后我将它设置为这样读入数组:
int arr[] = atoi(argv[1]);
不确定我错过了什么,因为这对我来说过去总是有用。有什么想法吗?
答案 0 :(得分: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;
}
这会给你一个更好的结果,因为它会对来自的错误做出反应 用户。