无法将 argv 分配给数组
Cannot assign argv to an array
我正在尝试将 argv 命令行上的输入分配给我的字符网络,但我不断收到一个错误
assignment to expression with array type
28 | networks[i] = atoi(argv[i]);
我想知道如何将 argv 分配到网络字符中。请告诉我。
谢谢
14 int main(int argc, char** argv){
15 for (int j =0; j<1; ++j){
16 if(argc == 1)
17 {
18 printf("ERROR ERROR, you messed up");
19 }
20
21 else
22 {
23 // hold network addresses in a 2-d array, with 4 unsigned char
24 unsigned char networks[argc][4];
25
26 //store argv into networks using atoi
27 for (int i = 0; i<argc; ++i){
28 networks[i] = atoi(argv[i]);
29 printf("\t%hhu\n", networks[i]);
30
31 }
32 }
33 }
将字符串转换为整数值时,请注意 atoi()
提供转换的零验证,并且对于给定的任何非数字字符串,将无提示返回零失败(例如 atoi("My Cow");
无提示返回失败0
)。 sscanf()
可以提供最小验证,strtol()
(或 strtoul()
等...)
可以提供完整验证
在您的例子中,networks[i] = atoi(argv[i]);
尝试将 int
分配给 unsigned char
的数组。这行不通,因为数组不是 lvalue(参见:C11 Standard - 6.3.2.1 Other Operands - Lvalues, arrays, and function designators(p3))
您所尝试的可以通过简单地创建一个 unsigned char
数组(在您的情况下是一个 VLA)来完成 注意:从 C11 开始,编译器支持 可变长度数组 是可选的——但大多数人将继续提供支持。
使用 sscanf()
验证输入的最小示例可以是:
#include <stdio.h>
int main (int argc, char **argv) {
unsigned char networks[argc];
int index = 0;
for (int i = 0; i < argc - 1; i++) { /* loop argc - 1 times */
unsigned char temp; /* temporary unsigned char */
if (sscanf (argv[i+1], "%hhu", &temp) == 1) { /* convert/validae argv[i+1] */
networks[index] = temp; /* on success, assign */
index += 1; /* increment index */
}
}
for (int i = 0; i < index; i++) /* loop index times */
printf ("networks[%d] = %d\n", i, networks[i]); /* output results */
return 0;
}
(注意: %hhu
是转换为 unsigned char
时使用的正确转换说明符)
例子Use/Output
$ ./bin/argv_networks 10 20 30 banana 40
networks[0] = 10
networks[1] = 20
networks[2] = 30
networks[3] = 40
(注意:无效输入"banana"
通过验证转换结果简单地被忽略)
检查一下,如果您还有其他问题,请告诉我。
我正在尝试将 argv 命令行上的输入分配给我的字符网络,但我不断收到一个错误
assignment to expression with array type
28 | networks[i] = atoi(argv[i]);
我想知道如何将 argv 分配到网络字符中。请告诉我。
谢谢
14 int main(int argc, char** argv){
15 for (int j =0; j<1; ++j){
16 if(argc == 1)
17 {
18 printf("ERROR ERROR, you messed up");
19 }
20
21 else
22 {
23 // hold network addresses in a 2-d array, with 4 unsigned char
24 unsigned char networks[argc][4];
25
26 //store argv into networks using atoi
27 for (int i = 0; i<argc; ++i){
28 networks[i] = atoi(argv[i]);
29 printf("\t%hhu\n", networks[i]);
30
31 }
32 }
33 }
将字符串转换为整数值时,请注意 atoi()
提供转换的零验证,并且对于给定的任何非数字字符串,将无提示返回零失败(例如 atoi("My Cow");
无提示返回失败0
)。 sscanf()
可以提供最小验证,strtol()
(或 strtoul()
等...)
在您的例子中,networks[i] = atoi(argv[i]);
尝试将 int
分配给 unsigned char
的数组。这行不通,因为数组不是 lvalue(参见:C11 Standard - 6.3.2.1 Other Operands - Lvalues, arrays, and function designators(p3))
您所尝试的可以通过简单地创建一个 unsigned char
数组(在您的情况下是一个 VLA)来完成 注意:从 C11 开始,编译器支持 可变长度数组 是可选的——但大多数人将继续提供支持。
使用 sscanf()
验证输入的最小示例可以是:
#include <stdio.h>
int main (int argc, char **argv) {
unsigned char networks[argc];
int index = 0;
for (int i = 0; i < argc - 1; i++) { /* loop argc - 1 times */
unsigned char temp; /* temporary unsigned char */
if (sscanf (argv[i+1], "%hhu", &temp) == 1) { /* convert/validae argv[i+1] */
networks[index] = temp; /* on success, assign */
index += 1; /* increment index */
}
}
for (int i = 0; i < index; i++) /* loop index times */
printf ("networks[%d] = %d\n", i, networks[i]); /* output results */
return 0;
}
(注意: %hhu
是转换为 unsigned char
时使用的正确转换说明符)
例子Use/Output
$ ./bin/argv_networks 10 20 30 banana 40
networks[0] = 10
networks[1] = 20
networks[2] = 30
networks[3] = 40
(注意:无效输入"banana"
通过验证转换结果简单地被忽略)
检查一下,如果您还有其他问题,请告诉我。