Чтение строки с файла, разбиение на лексемы и вывод по алфавиту - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Долго мучился, и набросал вот такой код:
#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();
}
Знаю что код не ахти, но может кто-нибудь поможет найти ошибку? Проблема в том, что при считывании из line лексем получается кракозябра, непонятные символы.

Решение задачи: «Чтение строки с файла, разбиение на лексемы и вывод по алфавиту»

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]);
        }*/
}

Объяснение кода листинга программы

  1. Включаются необходимые заголовочные файлы
  2. Устанавливается русская локаль
  3. Открывается файл для чтения
  4. Считывается строка из файла в массив
  5. Выводится считанная строка
  6. Выводится сообщение Слова :
  7. Производится разбиение строки на слова и сохранение их в массиве words
  8. Закрывается файл
  9. Отображается на экране массив words
  10. В данной версии программы не используется, но в предыдущей версии выводилось сообщение Строка состоит из слов:
  11. В данной версии программы не используется, но в предыдущей версии считывалось первое слово и копировалось в words[0]
  12. В данной версии программы не используется, но в предыдущей версии заполнялся массив words словами из строки
  13. В данной версии программы не используется, но в предыдущей версии выводилось каждое слово на новой строке с префиксом \%s``
  14. В данной версии программы не используется, но в предыдущей версии использовался цикл для прохода по всем словам в строке
  15. В данной версии программы не используется, но в предыдущей версии использовалась переменная i для отслеживания индекса текущего слова в массиве words
  16. В данной версии программы не используется, но в предыдущей версии использовалась функция strcpy для копирования слова в массив words
  17. В данной версии программы не используется, но в предыдущей версии использовалась функция printf для вывода слова на экран
  18. В данной версии программы не используется, но в предыдущей версии использовалась функция fclose для закрытия файла
  19. В данной версии программы не используется, но в предыдущей версии использовалась функция getch для ожидания нажатия клавиши
  20. В данной версии программы не используется, но в предыдущей версии использовалась функция strtok для разбиения строки на слова

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4 из 5
Похожие ответы