токенизировать два раза файл csv

Я использую strtok() в C для анализа строки csv.

Моя примерная строка:

str= "name1 secondname1 cin,name2 secondname2 cin"

Сначала я использую strtok с разделителем ",", а затем я разделяю строку с " ".

char delims1[] = ",";
char delims2[] = " ";
char *result1 = NULL;
char *result2 = NULL;

result1 = strtok(str, delims1);

while ( result1 != NULL ) {

    result2 = strtok(result1,delims2);

    while ( result2 != NULL ) {
        printf("%s\n" ,result2);

    }

    result1 = strtok(NULL, delims1);
}     

Ожидаемый результат:

name1
secondname1 
cin
name2
secondname2
cin

person kirowaxoaw    schedule 24.03.2013    source источник
comment
Что такое str и divided и что они содержат? Вам нужно показать этот код. Кроме того, какие результаты вы на самом деле получаете? Вы не указываете, в чем заключается ваш вопрос.   -  person Carey Gregory    schedule 25.03.2013
comment
Где твой вопрос?   -  person Patrick B.    schedule 25.03.2013
comment
Какая красивая демонстрация проблем с strtok(). Это плохая функция для использования почти всегда; список его ошибок разнообразен, но, в частности, вы не можете иметь два параллельных набора расщеплений, как вам кажется. Если вы должны попробовать, используйте strtok_r() или strtok_s() (примерно POSIX против Windows). Вы пропустили вызов strtok() во внутреннем цикле while, поэтому, поскольку ничего не меняется result2, код переходит в постоянный цикл. Хотя strtok() или его семейство можно заставить работать с демонстрационными данными, его нельзя разумно использовать для общего анализа данных CSV.   -  person Jonathan Leffler    schedule 25.03.2013


Ответы (1)


Добро пожаловать в StackOverflow. Когда вы задаете вопрос, постарайтесь на самом деле задать вопрос.

Однако в этом случае я просто предполагаю, что вы не получаете ожидаемого результата.

Проблема в том, что strtok хранит внутри состояние вашего последнего вызова. Поэтому, если вы смешаете два разных синтаксических анализа, у вас возникнут проблемы.

Реализация Microsoft библиотеки C предоставляет strtok_s, который позволяет вам передавать переменную состояния. Если вы используете этот компилятор, переключитесь на использование этой функции. В противном случае вам может понадобиться написать свой собственный.

В качестве альтернативы вы можете разметить каждый столбец за один проход и сохранить указатели в массиве. Затем выполните второй проход и токенизируйте каждую строку в массиве.

person paddy    schedule 24.03.2013
comment
Среди нескольких проблем с этим кодом то, что он не показывает, как инициализируются str и divided. Это две отдельные строки, и мы не знаем, что они содержат. Самая серьезная проблема заключается в том, что второй цикл while будет бесконечным циклом, если result2 не равен нулю. - person Carey Gregory; 25.03.2013
comment
Это правда, но если читать между строк, становится ясно, что есть второй вызов strtok, устанавливающий новый синтаксический анализ внутри цикла. Предполагая, что пользователь запускает свою программу или публикует весь соответствующий код, это является корнем текущих или будущих проблем. Судя по названию, они подозревают, что с этим что-то не так, поэтому я уточняю, что их подозрения верны. знак равно - person paddy; 25.03.2013
comment
см. также strtok_r(). @paddy По моему опыту, чтение между строк не является хорошим подходом к таким вопросам. Иногда код действительно так плох, как вы можете опасаться. - person Randy Howard; 25.03.2013