【问题标题】:C - How to read integer at certain place in the argument vector?C - 如何在参数向量中的某个位置读取整数?
【发布时间】:2021-02-10 05:39:30
【问题描述】:

我正在编写一个 C 程序,它从 .txt 文件中读取表数据,对其应用更改并将修改后的表打印到不同的 .txt 文件中。该程序的一部分是在 irow 参数之后在终端中输入的行之前打印并清空行的函数。以下是程序的编译和运行方式:

gcc -Wall -Wextra -Werror -o main main.c
./main irow [row]  <tab1.txt >tab2.txt

处理输入的部分程序:

int insertRow(char*argv[], int row_number) {
    row_number = 0;
    for(int i = 0; argv[i]; i++) {
        if ( isdigit(argv[i][0]) && (strcmp(argv[i - 1], "irow") == 0))
            if((argv[i][0] - '0') > 0)
                row_number = argv[i][0] - '0';
    }
    return row_number;
}

然后row_number在main方法中用于对表进行修改。

代码工作并执行它应该做的事情,但是我还没有想出更好的方法来从参数向量中读取 [row] 参数。如何不仅读取第一个数字,还读取该参数字符串中的整个整数?

【问题讨论】:

    标签: arrays c text io argv


    【解决方案1】:

    将包含数字的字符串转换为int

    row_number = atoi(argv[i]);
    

    另外,你不应该在签名中得到row_number。您没有使用它的值,您对row_number 所做的任何更改都不会影响调用函数。 您应该改为在函数中定义它:

    int row_number = 0;
    

    【讨论】:

    【解决方案2】:

    因为您的函数的第一个可执行语句是将row_number 设置为0,所以没有需要将它作为参数。它忽略传入的值并返回最终值。

    此外,使用argv 的方法比索引它更简单。

    而且,如果你有以下论点:

    23 irow 17
    

    您的函数无法处理得很好。它会尝试解码23 而不是17

    拥有一个“状态”变量并且一次只查看一个参数会更简单。

    而且,您可以/应该使用 atoi 来获取所有数字 [vs.仅解码数字字符串的第一个数字]。

    这是一个重构版本:

    #include <string.h>
    #include <stdlib.h>
    
    int
    insertRow(char **argv)
    {
        char *cp;
        int match = 0;
        int row_number = 0;
    
        for (cp = *argv++;  cp != NULL;  cp = *argv++) {
            // we just saw "irow", so this is the number
            if (match) {
                row_number = atoi(cp);
                break;
            }
    
            // if current token is "irow", next token is the number
            match = (strcmp(cp,"irow") == 0);
        }
    
        return row_number;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-18
      • 1970-01-01
      • 2020-09-26
      • 1970-01-01
      相关资源
      最近更新 更多