Чтение строки с файла, разбиение на лексемы и вывод по алфавиту - 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 для разбиения строки на слова