无法将 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"通过验证转换结果简单地被忽略)

检查一下,如果您还有其他问题,请告诉我。