无法将命令行参数读入整数数组 C
Cannot read Command Line Arguments into integer Array C
我正在尝试使用命令行参数并将其读入数组,但是编译器给我这个错误:
error: invalid initializer
我知道我需要使用 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
将 return 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;
}
这会给您带来更好的结果,因为它会对来自
用户。
我正在尝试使用命令行参数并将其读入数组,但是编译器给我这个错误:
error: invalid initializer
我知道我需要使用 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
将 return 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;
}
这会给您带来更好的结果,因为它会对来自 用户。