【问题标题】:Cannot assign argv to an array无法将 argv 分配给数组
【发布时间】:2021-05-22 12:03:11
【问题描述】:

我正在尝试将 argv 命令行上的输入分配给我的 char 网络,但我一直收到一个错误提示

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         }

【问题讨论】:

  • argv 是正式类型char *[](指针数组),networkunsigned char 的二维数组,例如正式类型unsigned char (*)[4]。类型不匹配。 networks[i] = atoi(argv[i]); 尝试将 int 分配给 unsigned char 的数组。数组不是左值
  • 有什么方法可以改变 argv 以便我可以将它们等同起来?
  • unsigned char networks[argc]; 将创建argc unsigned char 的数组(VLA)。然后分配networks[i] = atoi(argv[i]); 将起作用。 (尽管由于atoi() 返回类型int,你最好使用int networks[argc];)另外请注意atoi() 提供零错误检测,并且很乐意为atoi ("my cow"); 静默返回0 失败,最好使用sscanf()strtol() 用于转换。
  • 对不起没有正确阅读代码..我删除了我的评论。我是新手;_;
  • 别担心——我也犯了同样的罪(即使是今晚......)

标签: arrays c argv


【解决方案1】:

在将字符串转换为整数值时,请注意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 时使用的正确转换说明符)

使用/输出示例

$ ./bin/argv_networks 10 20 30 banana 40
networks[0] = 10
networks[1] = 20
networks[2] = 30
networks[3] = 40

注意:无效输入"banana"通过验证转换结果被简单地忽略)

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

【讨论】:

    猜你喜欢
    • 2015-04-25
    • 1970-01-01
    • 1970-01-01
    • 2012-03-08
    • 2019-05-28
    • 1970-01-01
    • 2017-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多