Чтение строки с файла, разбиение на лексемы и вывод по алфавиту - C (СИ)
Формулировка задачи:
Долго мучился, и набросал вот такой код:
Знаю что код не ахти, но может кто-нибудь поможет найти ошибку?
Проблема в том, что при считывании из line лексем получается кракозябра, непонятные символы.
#include<stdio.h> #include<string.h> #include<conio.h> #include<stdlib.h> #include<locale.h> #include<ctype.h> #define CHARS ".,?\" \n" int main(void) { FILE *fo; char line[80]; char *word[20],words[20][20]; int i,n,count,j; char S1[15]; //Temp setlocale(LC_ALL,"Russian"); fo=fopen("I:\\Хатин Константин\\Задания на аттестацию\\str.txt","r");//Открываем файл fgets(line,sizeof(line),fo); //Считываем с файла строку printf("Строка состоит из слов:\n"); *word=strtok(line, CHARS); //Считываем первое слово strcpy(words[0],word); //Копируем в массив слово i=0; while (word != NULL) //Заполняем массив словами из строки Лайн { *word=strtok(NULL, CHARS); strcpy(words[i++],word); printf("\"%s\"\n", words[i]); } //Ошибка где-то в (копировании) строк //Сортирова по алфавиту for (n=0;n<i;n++) { for (j=0;j<i-n;j++) { if (strcmp(words[j],words[j+1])>0) { strcpy (S1,words[j]); strcpy (words[j],words[j+1]); strcpy (words[j+1],S1); } } } //Вывод слов уже сортированных по алфавиту for (n=0;n<5;puts(words[n]),n++); getch(); }
Решение задачи: «Чтение строки с файла, разбиение на лексемы и вывод по алфавиту»
textual
Листинг программы
#include<stdio.h> #include<string.h> #include<conio.h> #include<stdlib.h> #include<locale.h> #include<ctype.h> #define CHARS ".,?\" \n" int main(void) { setlocale(LC_ALL,"Russian"); FILE * pFile; char mystring [100]; char *word; char words[20][20]; pFile = fopen ("C:\\str.txt" , "r"); fgets (mystring , 100 , pFile); printf (mystring); printf("\nСлова : "); word = strtok(mystring, CHARS); strcpy(words[0], word); int i = 1; while (word != NULL) { word = strtok(NULL,CHARS); if (word == NULL) break; else printf("\n%s", word); strcpy(words[i],word); } fclose (pFile); getch(); /*printf("Строка состоит из слов:\n"); *word=strtok(line, CHARS); //Считываем первое слово //strcpy(words[0],word); //Копируем в массив слово i=0; while (word != NULL) //Заполняем массив словами из строки Лайн { *word=strtok(NULL, CHARS); //strcpy(words[i++],word); printf("\"%s\"\n", words[i]); }*/ }
Объяснение кода листинга программы
- Включаются необходимые заголовочные файлы
- Устанавливается русская локаль
- Открывается файл для чтения
- Считывается строка из файла в массив
- Выводится считанная строка
- Выводится сообщение
Слова :
- Производится разбиение строки на слова и сохранение их в массиве words
- Закрывается файл
- Отображается на экране массив words
- В данной версии программы не используется, но в предыдущей версии выводилось сообщение
Строка состоит из слов:
- В данной версии программы не используется, но в предыдущей версии считывалось первое слово и копировалось в words[0]
- В данной версии программы не используется, но в предыдущей версии заполнялся массив words словами из строки
- В данной версии программы не используется, но в предыдущей версии выводилось каждое слово на новой строке с префиксом
\
%s`` - В данной версии программы не используется, но в предыдущей версии использовался цикл для прохода по всем словам в строке
- В данной версии программы не используется, но в предыдущей версии использовалась переменная i для отслеживания индекса текущего слова в массиве words
- В данной версии программы не используется, но в предыдущей версии использовалась функция strcpy для копирования слова в массив words
- В данной версии программы не используется, но в предыдущей версии использовалась функция printf для вывода слова на экран
- В данной версии программы не используется, но в предыдущей версии использовалась функция fclose для закрытия файла
- В данной версии программы не используется, но в предыдущей версии использовалась функция getch для ожидания нажатия клавиши
- В данной версии программы не используется, но в предыдущей версии использовалась функция strtok для разбиения строки на слова
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д