Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
ruslan_bastos
1 / 1 / 0
Регистрация: 10.12.2012
Сообщений: 17
#1

Разделение произвольного текста на слова - C++

10.02.2013, 13:12. Просмотров 563. Ответов 5
Метки нет (Все метки)

Пытаюсь разделить произвольный текст на отдельные слова. И присвоить каждое слово элементу структуры.
Но когда программа проходит первую строчку текста появляется ошибка, неизвестная мне.
Вот часть кода.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
void vvod(str *mas, FILE *fp, char *name)
{
 
        char seps[] = " .,!\n";
        int numWords = 0;
        char masStr[100];
        fp=fopen(name,"r");
        if(fp == NULL)
        {
            printf("\nОшибка открытия файла...");
        }
        else
        {
            while(!feof(fp))
            {
                fgets(masStr,100,fp);
                strcpy(mas[numWords].s, strtok( masStr, seps )); 
 
                while(mas[numWords].s != NULL )
                {
                    numWords++; // Получить следующий фрагмент
                    strcpy(mas[numWords].s, strtok( NULL, seps )); 
                    printf("%s\n", mas[numWords].s);
                }
                strcpy(masStr,"");
                
            }
            printf( "\nФайл прочитан. Нажмите ENTER.");
            getch();
        }
        fclose(fp);
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.02.2013, 13:12
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Разделение произвольного текста на слова (C++):

Дана строка символов, состоящая из произвольного текста, слова раз-делены пробелами. Вывести на экран порядковый номер слова, накрывающего k позицию - C++
Помогите с вот такой вот задачкой: Дана строка символов, состоящая из произвольного текста, слова раз- делены пробелами. Вывести на...

Токенизация, разделение текста на слова - C++
Здравствуйте, по заданию необходимо 1.Прочитать текст из первого файла. 2.Выделить словоформы и вписать их в отдельный двумерный...

Редактирование произвольного текста: удаление слова с заданным номером - C++
написать программу, которая редактирует произвольный текст, введенный с клавиатуры, удаляя из него слово с заданным номером(тоже с клавы...

Дана строка символов, состоящая из произвольного текста, слова разделены пробелами - C++
Дана строка символов, состоящая из произвольного текста, слова разделены пробелами. Вывести на экран порядковый номер слова ...

Напечатать слова, которые отличны от последнего слова текста, предварительно удалив из слова последнюю букву - C++
Дана последовательность содержащая от 1 до 30 слов, в каждом из которых от 1 до 5 строчных латинских букв; между соседними словами не менее...

Разделение слова на буквы - C++
Всем доброго времени суток. У меня возник вопрос. Допустим у есть переменная X типа string, в которую записано слово, "Code". Как мне...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
-=ЮрА=-
Заблокирован
Автор FAQ
10.02.2013, 13:20 #2
Цитата Сообщение от ruslan_bastos Посмотреть сообщение
str *mas
- пожалуста покажи как у тебя сделан пользовательский тип
А также покажи по коду CALL для void vvod(str *mas, FILE *fp, char *name)
ruslan_bastos
1 / 1 / 0
Регистрация: 10.12.2012
Сообщений: 17
10.02.2013, 13:50  [ТС] #3
struct str
{
char s[100];
};

И

vvod(mas, fp, name);
-=ЮрА=-
Заблокирован
Автор FAQ
10.02.2013, 14:02 #4
Цитата Сообщение от ruslan_bastos Посмотреть сообщение
char seps[] = " .,!\n";
- попробуй изъять из делиметорв слеш-н, думаю он и крошит всё - ибо fgets берёт строку в ней по идеи сотаётся \n в самом конце и когда strtok обрезает этот делиметр в итоге в strcpy пробуем сделать нечто следующее
strcpy(mas[numWords].s, "\0"); это и приводит к краху. В свете всего этого продумай и добавь перед strcpy условие с логикой strtok( masStr, seps ) != NULL

Добавлено через 2 минуты
А вообще лучше организуй свой цикл
Цитата Сообщение от ruslan_bastos Посмотреть сообщение
while(!feof(fp))
* * * * * * {
* * * * * * * * fgets(masStr,100,fp);
* * * * * * * * strcpy(mas[numWords].s, strtok( masStr, seps ));
while(mas[numWords].s != NULL )
* * * * * * * * {
* * * * * * * * * * numWords++; // Получить следующий фрагмент
* * * * * * * * * * strcpy(mas[numWords].s, strtok( NULL, seps ));
* * * * * * * * * * printf("%s\n", mas[numWords].s);
* * * * * * * * }
* * * * * * * * strcpy(masStr,"");
}
вот так
C
1
2
3
4
5
6
7
8
9
10
11
while(!feof(fp))
            {
                fgets(masStr,100,fp);
        for(char * tok = strtok( masStr, seps ); tok; tok = strtok( NULL, seps ))
                {
                    strcpy(mas[numWords].s, tok); 
                    numWords++; // Получить следующий фрагмент
                    printf("%s\n", mas[numWords].s);
                }
                //strcpy(masStr,"");
            }
ruslan_bastos
1 / 1 / 0
Регистрация: 10.12.2012
Сообщений: 17
10.02.2013, 14:35  [ТС] #5
Всё отлично работает! Благодарю. Я так понял в цикле будет происходить разделение по словам пока будет существовать переменная tok. Как только она равна нулю цикл завершается?
-=ЮрА=-
10.02.2013, 14:39     Разделение произвольного текста на слова
  #6

Не по теме:

ruslan_bastos, да всё верно, кстати объявление tok можно вынести вначало void vvod(str *mas, FILE *fp, char *name)

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.02.2013, 14:39
Привет! Вот еще темы с ответами:

Разделение строки на слова - C++
Подскажите пожалуйста, как разделить строку на отдельные слова. Заранее спасибо.

разделение строки на слова - C++
нужно разбить строку на слова (си) без использования библиотеки string.h (пользоваться можно только stdio.h) можно использовать...

Разделение строки на слова - C++
Текст в файле содержит числа, которые записаны в восьмеричной системе счисления. Преобразовать эти числа в десятичную систему счисления и...

Вводится строка произвольного текста. - C++
Вводится строка произвольного текста. Подсчитать количество цифр в данной строке. помогите пожалуйста c++ )


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
10.02.2013, 14:39
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru