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

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

Восстановить пароль Регистрация
 
Smith5989
4 / 4 / 0
Регистрация: 21.11.2012
Сообщений: 54
11.05.2013, 18:14     Удаление слов из текста #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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.05.2013, 18:14     Удаление слов из текста
Посмотрите здесь:

Задача на удаление слов на "а" из текста C++
C++ Строки(стринг).....удаление слов из текста
C++ Заданы два текста. Определить, можно ли получить первый текст перестановкой слов второго текста.
C++ удаление слов из строки
C++ Обработка текста, удаление повторного вхождения слов
C++ Удаление повторяющихся соседних слов из текста
C++ Строки. Удаление слов
Удаление четных слов C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zitxbit
Master C/C++
 Аватар для zitxbit
86 / 738 / 75
Регистрация: 11.04.2012
Сообщений: 971
12.05.2013, 11:16     Удаление слов из текста #2
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
59
60
61
62
63
#include <stdio.h>
#include <conio.h>
#include <ctype.h>
 
#include <iostream>
#include <cstring>
 
#define N 10
 
using namespace std;
 
int main(int argc, char* argv[])
{
    static char str[256] = "hello world how many things to do. to di to da. how to tell about C++";
 
             printf("%s\n", str);
 
    char *text[N] = { 0 }, *block = NULL; int i = 0;
    for (block = strtok(str,"."); block != NULL; block = strtok(NULL,"."))
        text[i++] = block;
    
    for (int s = 0; text[s] != NULL; s++)
    {
        int min = strlen(text[s]), min_i = 0;
        for (int i = 0; text[s][i] != '\0'; i++)
            if ((text[s][i] == ' ' && !isspace(text[s][i-1]) && 
                !isspace(text[s][i+1]) && i > 0) || (i == strlen(text[s])-1))
            {
                int n = i-1;
                while (!isspace(text[s][n]) && n >= 0) n--;
                if (abs(((i != strlen(text[s])-1) ? (n+1) : n) - i) < min) 
                    { min = abs((i != strlen(text[s])-1 ? (n+1) : n) - i); min_i = n+1; }
            }
 
        bool found = true;
        while (found)
        {
            for (int r = 0; text[s][r] != '\0'; r++)
                if (text[s][r] == ' ' || r == strlen(text[s])-1)
                {
                    int n = r-1;
                    while (!isspace(text[s][n]) && n >= 0) n--;
                    if (abs(((r != strlen(text[s])-1) ? (n+1) : n) - r) == min) 
                    { 
                        int x = min; found = true;
                        while (--x >= 0)
                        {
                            for (int t = n+1; text[s][t] != '\0'; t++)
                                text[s][t] = text[s][t+1];
                        }
                    }
 
                    else found = false;
                }
        }
 
        printf("string %d: %s\n",s,text[s]);
    }
 
    _getch();
 
    return 0;
}
Миниатюры
Удаление слов из текста  
Yandex
Объявления
12.05.2013, 11:16     Удаление слов из текста
Ответ Создать тему
Опции темы

Текущее время: 17:49. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru