C - Как мне разбить строку в текстовом файле и сохранить их значения? - PullRequest
0 голосов
/ 25 февраля 2019

Допустим, у меня есть несколько строк в моем текстовом файле:

print 1
set_flag 1 2 1
find_path 7 8
print 5

Я хочу иметь возможность разделить эти значения и применить его к своим функциям:

void print(int id) {...}
void set_flag(int a, int b, int c) {...}
void find_path(int from, int to) {...}

Этогде я застрял прямо сейчас:

char str[256];
while(fgets(str, 256, filename) != NULL){
    //if a line contains "set_flag" then call set_flag(int a, int b, int c)
    if((strstr(str, "set_flag")) != NULL){
        //retrieve the str and all individual int values
        ...
    }
}

Я немного посмотрел в Интернете и нашел предложения, используя strcmp, strstr, strtol и fscanf.Хотя назначение рекомендует strtol преобразовать читаемые значения в текстовом файле в «правильные» типы данных.

1 Ответ

0 голосов
/ 26 февраля 2019

Вы можете сохранить указатель соответствующей подстроки, а затем вставить символ NUL ('\0') в конец этой подстроки, что эффективно разбивает строку на две отдельные строки.

Но так как всевам действительно нужно местоположение оставшейся части строки после соответствующего 'set_flag', чтобы получить целочисленные значения, вам не нужно это делать.Вместо этого вы можете просто найти это местоположение в строке:

// if a line contains "set_flag" then call set_flag(int a, int b, int c)
char *p = strstr(str, "set_flag");
if (p != NULL) {
    // str contains 'set_flag', which p now points to
    p += strlen("set_flag");
    // p now points to the rest of the string following 'set_flag'

    // retrieve the individual int values from the rest of the string
    ... // left as an exercise, sscanf(p, ...) ...
}

В этот момент указатель p указывает на символ, следующий за 'set_flag' в текстовой строке, которую вы прочитали из ввода.Затем вы можете использовать sscanf() для извлечения целочисленных значений из строки (которую я оставлю вам в качестве упражнения).

...