Разобрать строку, разделенную запятыми и разрывами строк в C

Я хотел бы проанализировать строку, содержащую несколько разрывов строк, и каждая строка разделена запятыми. Я хотел бы напечатать каждый элемент, разделенный запятыми, из каждой строки. Это то, что я пробовал, но это не работает.

#include <stdio.h>
#include <string.h>

int main() {
    char cadena[] = "10,Arbol,3.5\n20,Perro,4.0\n30,Mesa,4.5";
    char cadena_copy[sizeof(cadena)]; // Crea una copia de cadena
    strcpy(cadena_copy, cadena);

    char *linea = strtok(cadena_copy, "\n"); // Tokeniza la cadena por saltos de línea

    // Itera sobre cada línea
    while (linea != NULL) {
        char *token = strtok(linea, ","); // Tokeniza la línea por comas

        // Itera sobre cada valor en la línea
        while (token != NULL) {
            printf("%s\n", token); // Imprime el valor
            token = strtok(NULL, ","); // Obtiene el siguiente valor
        }

        linea = strtok(NULL, "\n"); // Obtiene la siguiente línea
    }

    return 0;
}

Вот что я ожидаю на выходе:

10
Arbol
3.5
20
Perro
4.0
30
Mesa
4.5

Но вместо этого я получаю только первую строку:

10
Arbol
3.5

Как я могу это решить?

Если вы снова вызовете strtok с новым ненулевым параметром, он забудет о первом поиске, на который вы его отправили, вот почему. Попробуйте поискать перевод строки с помощью другой функции, например strchr, а затем используйте strtok для запятых в каждой строке.

Lundin 19.03.2024 15:44

В качестве примечания: предпочитайте использовать чисто английские идентификаторы и пишите свои комментарии также на чистом английском — вы будете делиться своим кодом с неиспаноязычными людьми, и хотя бы здесь, на SO — и для них вы довольно сложно поймете свой код. Кроме: Не комментируйте очевидное! Я и сам прекрасно вижу, например. что вы печатаете значения. Комментарии обычно необходимы, если, например, причина не очевидна (кроме этой).

Aconcagua 19.03.2024 15:50

Используйте strtok_r() в системах POSIX или strtok_s() в Windows, чтобы ваш код мог работать с двумя строками одновременно. См. дубликат для получения дополнительной информации.

Jonathan Leffler 19.03.2024 19:37
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
65
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Просто используйте оба в строке разделителя

int main() {
    char cadena[] = "10,Arbol,3.5\n20,Perro,4.0\n30,Mesa,4.5";
    char cadena_copy[sizeof(cadena)]; // Crea una copia de cadena
    strcpy(cadena_copy, cadena);

    char *token = strtok(cadena_copy, ",\n");

    // Itera sobre cada valor en la línea
    while (token != NULL) {
        printf("%s\n", token); // Imprime el valor
        token = strtok(NULL, ",\n"); // Obtiene el siguiente valor
    }

    return 0;
}

https://godbolt.org/z/fMv9evK7W

Другие вопросы по теме