C - Как прочитать целое число в определенном месте вектора аргумента?

Я пишу программу на 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] из вектора-аргумента. Как я могу прочитать не только первую цифру, но и все целое число внутри строки этого аргумента?


person harvey    schedule 27.10.2020    source источник


Ответы (2)


Поскольку первый исполняемый оператор вашей функции должен установить row_number в 0, нет необходимости использовать его в качестве аргумента. Он игнорирует переданное значение и возвращает окончательное значение.

Кроме того, есть более простые способы использования argv, чем его индексация.

И, если у вас были аргументы:

23 irow 17

Ваша функция не справится с этим. Он попытается декодировать 23 вместо 17.

Проще иметь переменную состояния и просматривать только один аргумент за раз.

И вы можете/должны использовать atoi, чтобы получить все цифры [по сравнению с . декодирование только первой цифры числовой строки].

Вот рефакторинговая версия:

#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;
}
person Craig Estey    schedule 27.10.2020

Чтобы превратить строку, содержащую число, в int:

row_number = atoi(argv[i]);

Кроме того, вы не должны получать row_number в подписи. Вы не используете его значение, и любые изменения, внесенные вами в row_number, не повлияют на вызывающую функцию. Вместо этого вы должны определить его внутри функции:

int row_number = 0;
person Shlomi Agiv    schedule 27.10.2020
comment
Спасибо за совет определить внутри функции и решение atoi. - person harvey; 28.10.2020
comment
stackoverflow.com/questions/1488569/atoi-string-to-int - person William Pursell; 28.10.2020
comment
Вам следует избегать атои. При определенных входных данных это вызовет неопределенное поведение. - person William Pursell; 28.10.2020