Я пытаюсь прочитать файл в этом формате:
05874121 A 7
07894544 C 3
05655454 B 5
05879544 B 6
05763465 C 2
и назначьте каждое «слово» различным переменным (dni, модель, мусор)
Этот код работает в Linux, и я использую CLion для отладки.
char *path = "file.txt";
FILE *f;
int result;
char dni[9], model[1], trash[100];
f = fopen(path, "r");
do {
result = fscanf(f, "%s %s %s", dni, model, trash);
printf("DNI: %s\n", dni);
}
while( result > 0);
fclose(f);
Это должно печатать значения первого столбца, но когда я запускаю программу, вывод просто: «ДНР:» «ДНР:» «ДНР:» ... и так далее.
Во время отладки я понял, что "dni" правильно хранит все числа (как символы), но самый первый элемент, dni[0], всегда: 0 '/000' как если бы это был конец строки.
Я не знаю, почему это происходит.
Вам нужно выделить место для завершающего символа '\0' в каждой из ваших строк. В случае model вы выделили один символ, что означает, что вы можете безопасно хранить только строку нулевой длины плюс завершающий нуль. Итак, у вас проблема с повреждением памяти.
Необходимость в байтовых строках завершающийся нулем содержать пространство для терминатора, а также самих строковых данных должна была быть изучена практически в любой книге, учебнике или классе. Если это не так, вам нужно сменить книгу, учебник или не пропускать занятия.
Попробуйте model[1] --> model[2] и "%s %s %s" --> "%8s %1s %99s"





Я сделал 2 исправления в вашем коде:
#include <stdio.h>
int main (int argc, char ** argv) {
char *path = "file.txt";
FILE *f;
int result;
char dni[9], model[2], trash[100];
f = fopen(path, "r");
while(1) {
result = fscanf(f, "%s %s %s", dni, model, trash);
if (result < 1) break;
printf("DNI: %s model %s trash %s\n", dni, model, trash);
}
fclose(f);
return 0;
}
Во-первых, переменная model[2] должна иметь дополнительный символ в конце строки.
Затем строка «if (result <1) break;».
Вероятно, ошибкой была модель[1] только с одним символом. \000 в dni может быть концом строки модели.
Проблема решена добавлением лишнего символа в переменную модели, спасибо!
Сколько байтов содержит заканчивающаяся
\0строка со значением"C"?