Я хотел бы проанализировать строку, содержащую несколько разрывов строк, и каждая строка разделена запятыми. Я хотел бы напечатать каждый элемент, разделенный запятыми, из каждой строки. Это то, что я пробовал, но это не работает.
#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
Как я могу это решить?
В качестве примечания: предпочитайте использовать чисто английские идентификаторы и пишите свои комментарии также на чистом английском — вы будете делиться своим кодом с неиспаноязычными людьми, и хотя бы здесь, на SO — и для них вы довольно сложно поймете свой код. Кроме: Не комментируйте очевидное! Я и сам прекрасно вижу, например. что вы печатаете значения. Комментарии обычно необходимы, если, например, причина не очевидна (кроме этой).
Используйте strtok_r() в системах POSIX или strtok_s() в Windows, чтобы ваш код мог работать с двумя строками одновременно. См. дубликат для получения дополнительной информации.





Просто используйте оба в строке разделителя
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;
}
Если вы снова вызовете
strtokс новым ненулевым параметром, он забудет о первом поиске, на который вы его отправили, вот почему. Попробуйте поискать перевод строки с помощью другой функции, напримерstrchr, а затем используйтеstrtokдля запятых в каждой строке.