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

Удаление слов из текста - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ ввод пути к файлу с консоли http://www.cyberforum.ru/cpp-beginners/thread861480.html
подскажите пожалуйста, вот как отрыть файл для работы с ним я знаю, но покрайней мере я делаю так FILE *f; f=fopen("input.txt","r"); а можно как что бы указывать путь к файлу с консоли, что...
C++ Среднее геометрическое С++ Вычислить среднее геометрическое для каждого элемента одномерного массива по следующему правилу : {b}_{i}=\sqrt{a(i)*a(2)*...*a(i)} \sqrt{a(i)*a(2)*...*a(i)} Использовать функцию вычисления... http://www.cyberforum.ru/cpp-beginners/thread861478.html
Двуязычие приложения C++
Есть собственно С++ код работает все в консоли Не пойму как сделать что бы пользователь мог выбрать на каком языке будет отображаться текст программы на русском или на английском.. Выбор между...
Показ скрытого сообщения C++
Добрый день. Есть 2 класса 1-главный 2-второстепенный Когда перед пользователем появляется консоль в консоле можно зайти в меню 1 класса или во 2 класс. Если пользователь сразу из главного...
C++ Выделение памяти под массив строк http://www.cyberforum.ru/cpp-beginners/thread861445.html
Вот нерабочий код и сейчас объясню, что пытаюсь сделать fstream f; f.open("in.txt", ios::in); int i=0, j=0; char **txt=(char**)malloc(1); while (!f.eof()) { txt=(char*)malloc(1); ...
C++ Сортировка по любому полю Обработать массив структур следующим образом: п.1) ввести элементы массива с клавиатуры(текущее количество эле- ментов массива вводится с клавиатуры (по соответствующему ... подробнее

Показать сообщение отдельно
Smith5989
4 / 4 / 0
Регистрация: 21.11.2012
Сообщений: 54

Удаление слов из текста - C++

11.05.2013, 18:14. Просмотров 720. Ответов 1
Метки (Все метки)

Добрый день!
есть задачка: Определить самое короткое слово в каждом предложении. Удалить эти слова из текста.Для обработки строк следует использовать функции стандартной библиотеки <cstring>.Примечание: следует использовать строки, представленные как массив символов. Строки, созданные с помощью классов (таких, как например, string из библиотеки STL) использовать запрещается.

У меня получился вот такой код
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <iostream>
#include <cstring>
// нахождение минимального размера слова
int getMinSizeWord(char *text){
    // если придет слово больше 20 символов программа будет работать с ошибками, но слово в 20 символов маловероятно
    int sizeOfMinimalWord=20,k=0;
    // нахождение размера text
    int size=strlen(text);
    for(int i=0;i<size;++i){
    // подсчитываем количество символов в каждом слове
        if(text[i]!=' '||text[i]!=','||text[i]!='.'||text[i]!='!',text[i]!='?')
            ++k;
        /*как только приходит пробел или какой либо знак препинания, это означает что в текущем слове количество букв подсчитано
         во входной строке не будет несколько подряд идущих пробелов, позже будет отдельная функция которая будет решать проблему с пробелами*/
        if(text[i]==' '||text[i]==','||text[i]=='.'||text[i]=='!',text[i]=='?'){
            if(k<sizeOfMinimalWord)
                sizeOfMinimalWord=k;
            // обнуления счетчика количества символов, тк гарантированно дальше будет новое слово
            k=0;
        }
    }
    return sizeOfMinimalWord;
}
 
void deleteWord(char *text,int sizeOfDeletWord){
    char brokenText[1000][20],newText[1000];
    // нахождение размера text
    int size=strlen(text),
        ind=0,j=0;
    for(int i=0;i<size;++i){
        //заполнение  двумерного массива символами из text
        if(text[i]!=' '||text[i]!=','||text[i]!='.'||text[i]!='!',text[i]!='?'){
            brokenText[ind][j++]=text[i];
        }
        if(text[i]==' '||text[i]==','||text[i]=='.'||text[i]=='!',text[i]=='?'){
            //избавление от слов неподходящего размера
            if(strlen(brokenText[ind])!=sizeOfDeletWord){
                strcat_s(newText,brokenText[ind]);
                // добавление знаков препинания, что бы они не потерялись. 
                //похоже я не правильно использую эту функцию, видимо вместо i она добавляет по i
                //strncat_s(newText,text,i);
            }
            ++ind;
            j=0;
        }
    std::cout<<newText; 
    }
}
int main(){
    char textInMass[1000];
    char *text;
    text=gets_s(textInMass);
    int sizeOfMinimalWord=getMinSizeWord(text);
    deleteWord(text,sizeOfMinimalWord);
    return 0;
}
ошибка в функции удаления слова, подскажите пожалуйста как ее исправить?

Добавлено через 3 часа 13 минут
я допустил несколько опечаток, однако проблемы это не решило
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <iostream>
#include <cstring>
// нахождение минимального размера слова
int getMinSizeWord(char *text){
    // если придет слово больше 200 символов программа будет работать с ошибками, но слово в 200 символов маловероятно
    int sizeOfMinimalWord=200,k=0;
    // нахождение размера text
    int size=strlen(text);
    for(int i=0;i<size;++i){
    // подсчитываем количество символов в каждом слове
        if(text[i]!=' '||text[i]!=','||text[i]!='.'||text[i]!='!'||text[i]!='?')
            ++k;
        /*как только приходит пробел или какой либо знак препинания, это означает что в текущем слове количество букв подсчитано
         во входной строке не будет несколько подряд идущих пробелов, позже будет отдельная функция которая будет решать проблему с пробелами*/
        if(text[i]==' '||text[i]==','||text[i]=='.'||text[i]=='!'||text[i]=='?'){
            if(k<sizeOfMinimalWord)
                sizeOfMinimalWord=k;
            // обнуления счетчика количества символов, тк гарантированно дальше будет новое слово
            k=0;
        }
    }
    return sizeOfMinimalWord;
}
 
void deleteWord(char *text,int sizeOfDeletWord){
    char brokenText[1000][20],newText[1000];
    // нахождение размера text
    int size=strlen(text),
        ind=0,j=0;
    for(int i=0;i<size;++i){
        //заполнение  двумерного массива символами из text
        if(text[i]!=' '||text[i]!=','||text[i]!='.'||text[i]!='!'||text[i]!='?'){
            brokenText[ind][j++]=text[i];
        }
        if(text[i]==' '||text[i]==','||text[i]=='.'||text[i]=='!'||text[i]=='?'){
            //избавление от слов неподходящего размера
            if(strlen(brokenText[ind])!=sizeOfDeletWord){
                brokenText[ind][j]='\0';
                strcat(newText,brokenText[ind]);
                // добавление знаков препинания, что бы они не потерялись. 
                //похоже я не правильно использую эту функцию, видимо вместо i она добавляет по i
                //strncat_s(newText,text,i);
            }
            ++ind;
            j=0;
        }
    }
    strcat(newText,'\0');
    std::cout<<newText; 
}
int main(){
    char textInMass[1000];
    char *text;
    text=gets_s(textInMass);
    int sizeOfMinimalWord=getMinSizeWord(text);
    deleteWord(text,sizeOfMinimalWord);
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru