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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.86
dander
0 / 0 / 0
Регистрация: 03.12.2010
Сообщений: 44
#1

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

25.10.2011, 12:45. Просмотров 2804. Ответов 26
Метки нет (Все метки)

Привет.
Нужна ваша помощь в написании проги на С. Не на С++ =)
Ниже приведено условие:
В символьной строке удалить все слова, состоящие из нечетного количества букв.
Всем "+" за помощь=) Спасибо.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.10.2011, 12:45
Здравствуйте! Я подобрал для вас темы с ответами на вопрос В символьной строке удалить все слова, состоящие из нечетного количества букв. (C++):

В символьной строке удалить все слова, состоящие из N - букв - C++ - C++
Помогите пожалуйста не могу написать программу через string.

В символьной строке удалить все слова, состоящие более чем из N - букв - C++
Напихал все что можно, не работает. Программирования не знаю похоже):wall: #include <iostream> // огранизация ввод/вывод #include...

В символьной строке удалить все слова, состоящие более чем из N букв - C++
Не использовать дефолтные функции работы со строками (например strstr, strlen) -В символьной строке удалить все слова, состоящие более...

Найти в списке из 7 слов все слова, состоящие из заданного количества букв - C++
Как решить такое в Borland C++? что использовать строки или символы? какую команду использовать для определения количества букв в одном...

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

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

26
easybudda
Модератор
Эксперт CЭксперт С++
9683 / 5633 / 956
Регистрация: 25.07.2009
Сообщений: 10,813
25.10.2011, 13:38 #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
/* ANSI C 99 */
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
    
char * no_odd_len_words(char * str, const char * delim){
    char buf[strlen(str) + 2], * p;
    
    for ( *buf = 0, p = strtok(str, delim); p; p = strtok(NULL, delim) ){
        if ( ! ( strlen(p) & 1 ) ){
            strcat(buf, p);
            strcat(buf, " ");
        }
    }
    
    return strcpy(str, buf);
}
 
#define STR_LEN 256
#define STR_MASK "%255[^\n]%*c"
#define DELIM " ,.;:!?\t"
    
int main(void){
    char str[STR_LEN];
    
    while ( printf("String: ") > 0 && scanf(STR_MASK, str) == 1 )
        printf("Result: %s\n", no_odd_len_words(str, DELIM));
    
    exit(0);
}
1
-=ЮрА=-
Заблокирован
Автор FAQ
25.10.2011, 15:39 #3
Очень давно хотел написать алгоритм чтобы выделять токены и не гробить исходную строку strtok-ом
ниже мои старания на Си
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
#include <string.h>//strtok strstr
#include <ctype.h>//toupper - возврат символа в верххнем регистре
#include <stdio.h>//printf scanf
#include <conio.h>//getch
 
//Мой алгоритм не совершенен в плане выделения слов
//они могут идти с запятыми и точками вконце
//поэтому их нужно пропускать
long getStrLen(char * str)
{
    long k = 0,sLen = strlen(str);
    for(long i = 0; i < sLen; i++)
    {
        if(!isalpha(str[i]))
            k++;
    }
    return sLen - k;
}
 
int main()
{
    char chr;//Подхватит в себя '\n' остающийся после ввода
    char str[1025] = {0};//Будет содержать в себе предложение
    char buf[32]   = {0};//Слов длинне 32 символов ещё не встречал
    long sLen;//Будет содержать в себе длинну str
    long wLen;//Будет содержать в себе число букв в слове
    long pos;//Текущая позиция в строке
    do
    {
        printf("Enter sentence :\n");
        scanf("%[^\n]%c",str,&chr);
        //strcpy(str,"This, - is the test of my program!");
        pos = 0;
        sLen = strlen(str);
        printf("\tString after removing not odd_words : \n");
        //Выделяем из строки 1-е слово
        while(sscanf(&str[pos],"%s",buf))
        {
            pos += (wLen = strlen(buf));
            //Если слово содержит в себе нечётное 
            //число букв вычёркиваем его
            if(getStrLen(buf) % 2 != 0)
            {
                strcpy(&str[pos - wLen - 1],&str[pos]);
                str[sLen - wLen - 1] = '\0';
                pos++;
            }
            sLen = strlen(str);
            //Пропускаем пробелы
            while(str[pos] == ' ' && pos < sLen)
                pos++;
            if(sLen <= pos)
                break;          
        }
        printf("%s",str);
        printf("\nPress Y for new input\n");
    }
    while(toupper(getch()) == 'Y');
    return 0;
}
0
Миниатюры
В символьной строке удалить все слова, состоящие из нечетного количества букв.  
-=ЮрА=-
Заблокирован
Автор FAQ
25.10.2011, 15:52 #4
easybudda,
Цитата Сообщение от easybudda Посмотреть сообщение
char buf[strlen(str) + 2]
- а такое в Visual Studio возможно или это для DevC???
0
diagon
Higher
1930 / 1196 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
25.10.2011, 16:02 #5
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- а такое в Visual Studio возможно или это для DevC???
В С99 есть VLA. MSVC вроде не поддерживает C99.
1
easybudda
Модератор
Эксперт CЭксперт С++
9683 / 5633 / 956
Регистрация: 25.07.2009
Сообщений: 10,813
25.10.2011, 16:19 #6
Цитата Сообщение от diagon Посмотреть сообщение
MSVC вроде не поддерживает C99.
Во всяком случае VLA точно не поддерживает. В Dev С++ используется компилятор MinGW, то есть должно работать.
1
accept
4823 / 3244 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
26.10.2011, 07:15 #7
Цитата Сообщение от -=ЮрА=-
C
1
while(sscanf(&str[pos],"%s",buf))
sscanf() может вернуть EOF, который является истиной

C
1
2
3
4
5
6
7
8
9
#include <stdio.h>
 
int main(void)
{
    char s[100];
    
    printf("%d\n", sscanf("   ", "%s", s));
    return 0;
}
Код
[guest@localhost tests]$ .ansi t.c -o t
[guest@localhost tests]$ ./t
-1
[guest@localhost tests]$
0
-=ЮрА=-
Заблокирован
Автор FAQ
26.10.2011, 09:20 #8
Цитата Сообщение от accept Посмотреть сообщение
sscanf() может вернуть EOF, который является истиной
- поетому в цикле есть допусловие выхода
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
if(sLen <= pos)
* * * * * * * * * * * * * * * * break;
accept, к чему ваш пост был???
0
xAtom
915 / 740 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
26.10.2011, 09:35 #9
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
#include <stdio.h>
#include <ctype.h>
 
char*  str_erase_nc(char* str) {
   int len;
   char *iter, *sa, *sb, *tmp = str;
   while(*str) {
        for(; ! isalpha(*str) && *str; *str++);
        for(len = 0, iter = str; isalpha(*iter) && *iter; *iter++, ++len);
        if(len & 1) {
            while(len--)
                 for(sa = str, sb = str + 1; *sa; *sa++ = *sb++);
        } else
                 str += len;
    }
    return tmp;
}
 
int  main(void) {
   char str[] = "aaa BB cccccc [xor]. blablab <FINALLY>  ENDX";
   puts( str_erase_nc(str) );
   getchar();
   return 0;
}
1
accept
4823 / 3244 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
26.10.2011, 11:11 #10
Цитата Сообщение от -=ЮрА=-
- поетому в цикле есть допусловие выхода
оно должно быть в заголовке, а так на EOF цикл начинает работать
0
-=ЮрА=-
Заблокирован
Автор FAQ
26.10.2011, 13:18 #11

Не по теме:

Цитата Сообщение от accept Посмотреть сообщение
а так на EOF цикл начинает работать
- не будет такого!
Давайте не холиворить, алгоритм я тестировал вчера притом довольно плотно...
Кстати от возможного облома я ещё и этим застраховался
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
char str[1025] = {0};



Добавлено через 1 час 0 минут
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
scanf("%[^\n]%c",str,&chr);
- вводим строку str (можно с пробелами, как раз это умный спецификатор ввода %[^\n] - считает все до символа \n, который мы запишем уже в chr (в буфере чтоб не висел)

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
while(sscanf(&str[pos],"%s",buf))
- sscanf производит чтение из строки str в соответсвии со спецификатором %s - т.е. выделяем подстроку(слово), которое записывается в buf. При успешном считывании подстроки sscanf возвращает 1 иначе 0, вобщем если мы перестанем считывать цикл остановиться

Добавлено через 4 минуты
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
pos += (wLen = strlen(buf));
- это позиция с которой будем производить выкопировку подстроки sscanf(&str[pos],"%s",buf)

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
if(getStrLen(buf) % 2 != 0)
- здесь получаем реальную длинну слова, как я уже отмечал

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
//Мой алгоритм не совершенен в плане выделения слов
//они могут идти с запятыми и точками вконце
//поэтому их нужно пропускать
sscanf - у фиолетово есть после слова знак препинания или нет, для него подстрока то что разделено пробелами, т.е. запятая у слова также подхватывается, поэтому эта функция
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
long getStrLen(char * str)
- подсчитывает именно число букв в слове, запятые и прочее пропускается

Добавлено через 2 минуты
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
strcpy(&str[pos - wLen - 1],&str[pos]);
тут делаем следующее
Моя строка
This, - is the test of my program!
мы дошли до the так вот мы копируем test of my program! на место the test of my program!,
получается
This, - is test of my program!ram!

Добавлено через 6 минут
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
str[sLen - wLen - 1] = '\0';
- ну а здесь обрезаем This, - is test of my program!ram! на оставшийся после копирования кусок строки ram! получаем
This, - is test of my program!
и сдвигаем позицию в строке на 1-ку

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
pos++;
- этим мы попадаем сюда " test of my program!".
Далее пропускаем пробелы (они будут портить нам жизнь если их не удалить)
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
//Пропускаем пробелы
* * * * * * * * * * * * while(str[pos] == ' ' && pos < sLen)
* * * * * * * * * * * * * * * * pos++;
Получаем "test of my program!". и возвращаемся вначало цикла, далее в buf запишется уже test и алгоритм не будет ничего удалять из исходной строки до того как не встретит program!, program содержит нечётное число букв, поєтому как и the программа его выбросит из исходной строки

Добавлено через 3 минуты
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
if(sLen <= pos)
* * * * * * * * * * * * * * * * break;
- ну а здесь проверяем не достигли ли конца строки, если это вначало цикла уже не зайдём, т.к. break прервём цикл
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
while(sscanf(&str[pos],"%s",buf))
- и sscanf не будет работать с пустой строкой (вот Вам accept и допусловие выхода)

Добавлено через 1 минуту
Далее по коду всё тривиально просто
dander, надеюсь мои коментарии помогут вам детальней разобраться. Да многовато всего напихано в алгоритм, ну и задача мягко сказать стоит не 2 + 2

Добавлено через 3 минуты
dander, в принципе если Вам сложно будет понять код, возьмите код easybudda, он в плане объёма меньше вот тут только замените это
Цитата Сообщение от easybudda Посмотреть сообщение
char buf[strlen(str) + 2],
на это
C
1
char buf[STR_LEN]
иначе в Visual Studio компилятор выдаст ошибку
1
easybudda
Модератор
Эксперт CЭксперт С++
9683 / 5633 / 956
Регистрация: 25.07.2009
Сообщений: 10,813
26.10.2011, 13:48 #12
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
он в плане объёма меньше вот тут только замените это
C
1
char buf[strlen(str) + 2],
на это
C
1
char buf[STR_LEN]
... и получите потенциальную дыру в коде. Как Вы думаете, почему там + 2 стоит?
0
-=ЮрА=-
Заблокирован
Автор FAQ
26.10.2011, 14:25 #13
Цитата Сообщение от easybudda Посмотреть сообщение
и получите потенциальную дыру в коде. Как Вы думаете, почему там + 2 стоит?
- я спешил поетому 2-ку унёс)Суть сводилось к строке buf константного размера я к этому dander, подводил
0
easybudda
Модератор
Эксперт CЭксперт С++
9683 / 5633 / 956
Регистрация: 25.07.2009
Сообщений: 10,813
26.10.2011, 14:42 #14
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Суть сводилось к строке buf константного размера
ну это да, только тогда лучше было бы
C
1
2
//...
    static char buf[STR_LEN + 1];
Суть дыры в том, что функция лишний пробел в конце строки лепит. При максимальном количестве символов 255 подайте на вход строку из 4 символов, пробела и ещё 250 символов - получится выход за границу. То есть буфер должен быть без учёта нуля на символ длиннее. Соответственно с учётом - на 2.
0
-=ЮрА=-
Заблокирован
Автор FAQ
26.10.2011, 14:59 #15
Цитата Сообщение от easybudda Посмотреть сообщение
Суть дыры в том, что функция лишний пробел в конце строки лепит.
- я этого не увидел(бегло смотрел код), но думаю, что и Вы и Я ответили ужеdander нормальными кодами. С учётом константного размера buf dander спокойно может реализовывать Ваш код с strtok-ами, он проще для объяснения преподу при здаче задания, свой код я приурачивал к исключению strtok-а и буфера, вот и всё
0
26.10.2011, 14:59
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.10.2011, 14:59
Привет! Вот еще темы с ответами:

Удалить из строки слова, состоящие только из прописных букв - C++
Работа со строками (С) Дана строка символов, состоящая из прописных и строчных латинских букв и пробелов. Группы символов, разделенные...

Удалить из текста все слова, которые начинаются с букв, заданных в строке запроса - C++
Пытался сам написать,но выдает ошибку.Как правильно должен выглядеть код?Заранее спасибо. #include&lt;iostream&gt; #include&lt;stdio.h&gt; ...

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

Вывести на экран все слова сообщения, состоящие из n букв - C++
вывести на экран все слова сообщения состоящие из n букв


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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