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

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

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

В символьной строке удалить все лишние подряд идущие пробелы. C++
C++ Написать программу, которая считывает текст с клавиатуры и выводит на экран только слова состоящие из заданного количества букв
C++ Строка: вывести на экран все слова сообщения, состоящие из n букв.
Найти в списке из 7 слов все слова, состоящие из заданного количества букв C++
В символьной строке удалить все слова, состоящие более чем из N - букв C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
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);
}
-=ЮрА=-
Заблокирован
Автор 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;
}
Миниатюры
В символьной строке удалить все слова, состоящие из нечетного количества букв.  
-=ЮрА=-
Заблокирован
Автор FAQ
25.10.2011, 15:52     В символьной строке удалить все слова, состоящие из нечетного количества букв. #4
easybudda,
Цитата Сообщение от easybudda Посмотреть сообщение
char buf[strlen(str) + 2]
- а такое в Visual Studio возможно или это для DevC???
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
25.10.2011, 16:02     В символьной строке удалить все слова, состоящие из нечетного количества букв. #5
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- а такое в Visual Studio возможно или это для DevC???
В С99 есть VLA. MSVC вроде не поддерживает C99.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
25.10.2011, 16:19     В символьной строке удалить все слова, состоящие из нечетного количества букв. #6
Цитата Сообщение от diagon Посмотреть сообщение
MSVC вроде не поддерживает C99.
Во всяком случае VLA точно не поддерживает. В Dev С++ используется компилятор MinGW, то есть должно работать.
accept
4838 / 3237 / 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]$
-=ЮрА=-
Заблокирован
Автор FAQ
26.10.2011, 09:20     В символьной строке удалить все слова, состоящие из нечетного количества букв. #8
Цитата Сообщение от accept Посмотреть сообщение
sscanf() может вернуть EOF, который является истиной
- поетому в цикле есть допусловие выхода
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
if(sLen <= pos)
* * * * * * * * * * * * * * * * break;
accept, к чему ваш пост был???
xAtom
 Аватар для xAtom
910 / 735 / 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;
}
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
26.10.2011, 11:11     В символьной строке удалить все слова, состоящие из нечетного количества букв. #10
Цитата Сообщение от -=ЮрА=-
- поетому в цикле есть допусловие выхода
оно должно быть в заголовке, а так на EOF цикл начинает работать
-=ЮрА=-
Заблокирован
Автор 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 компилятор выдаст ошибку
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
26.10.2011, 13:48     В символьной строке удалить все слова, состоящие из нечетного количества букв. #12
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
он в плане объёма меньше вот тут только замените это
C
1
char buf[strlen(str) + 2],
на это
C
1
char buf[STR_LEN]
... и получите потенциальную дыру в коде. Как Вы думаете, почему там + 2 стоит?
-=ЮрА=-
Заблокирован
Автор FAQ
26.10.2011, 14:25     В символьной строке удалить все слова, состоящие из нечетного количества букв. #13
Цитата Сообщение от easybudda Посмотреть сообщение
и получите потенциальную дыру в коде. Как Вы думаете, почему там + 2 стоит?
- я спешил поетому 2-ку унёс)Суть сводилось к строке buf константного размера я к этому dander, подводил
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
26.10.2011, 14:42     В символьной строке удалить все слова, состоящие из нечетного количества букв. #14
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Суть сводилось к строке buf константного размера
ну это да, только тогда лучше было бы
C
1
2
//...
    static char buf[STR_LEN + 1];
Суть дыры в том, что функция лишний пробел в конце строки лепит. При максимальном количестве символов 255 подайте на вход строку из 4 символов, пробела и ещё 250 символов - получится выход за границу. То есть буфер должен быть без учёта нуля на символ длиннее. Соответственно с учётом - на 2.
-=ЮрА=-
Заблокирован
Автор FAQ
26.10.2011, 14:59     В символьной строке удалить все слова, состоящие из нечетного количества букв. #15
Цитата Сообщение от easybudda Посмотреть сообщение
Суть дыры в том, что функция лишний пробел в конце строки лепит.
- я этого не увидел(бегло смотрел код), но думаю, что и Вы и Я ответили ужеdander нормальными кодами. С учётом константного размера buf dander спокойно может реализовывать Ваш код с strtok-ами, он проще для объяснения преподу при здаче задания, свой код я приурачивал к исключению strtok-а и буфера, вот и всё
dander
0 / 0 / 0
Регистрация: 03.12.2010
Сообщений: 44
26.10.2011, 17:48  [ТС]     В символьной строке удалить все слова, состоящие из нечетного количества букв. #16
вот скрин
в чем ошибка? =)
Миниатюры
В символьной строке удалить все слова, состоящие из нечетного количества букв.  
dander
0 / 0 / 0
Регистрация: 03.12.2010
Сообщений: 44
26.10.2011, 18:32  [ТС]     В символьной строке удалить все слова, состоящие из нечетного количества букв. #17
easybudda,
да при выполнении программы в VS выдает ошибку
так что нужно исправить, что код работал VS&
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
27.10.2011, 02:10     В символьной строке удалить все слова, состоящие из нечетного количества букв. #18
-=ЮрА=-, сделай вот так
C
1
    while(sscanf(&str[pos],"%s",buf) == 1)
-=ЮрА=-
Заблокирован
Автор FAQ
27.10.2011, 09:27     В символьной строке удалить все слова, состоящие из нечетного количества букв. #19
dander, ты создал проект Console Aplication???По скрину смотрю что нет, хотя в 10-ке я не спец у меня 2008 и 98-ая. Так вот возьми скопируй мой код просто в срр файл, помести єтот файл в отдельную папку, открой и скомпилируй проект, по поводу твоего письма в личку - Ты ИМЕННО ОШИБАЕШСЯ, т.к. дословно - прилепил код в проект не Console Aplication и теперь ломаешь голову, что же не так...

По поводу этого
Цитата Сообщение от dander Посмотреть сообщение
так что нужно исправить, что код работал VS&
Уже написал тебе
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
dander, в принципе если Вам сложно будет понять код, возьмите код easybudda, он в плане объёма меньше вот тут только замените это
Сообщение от easybudda
char buf[strlen(str) + 2],
на это
Код C
1
char buf[STR_LEN]
иначе в Visual Studio компилятор выдаст ошибку

Не по теме:

accept, тебе опять неймётся?Мне чё скрин сюда работы выложить, удосужся хотябы скомпилировать мой код и запустить + потестить а потом говори что мне и как писать, ну реально зачем вставляешь свои 5-ть копеек туда куда не нужно...

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.10.2011, 09:36     В символьной строке удалить все слова, состоящие из нечетного количества букв.
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
27.10.2011, 09:36     В символьной строке удалить все слова, состоящие из нечетного количества букв. #20
Цитата Сообщение от -=ЮрА=-
ну реально зачем вставляешь свои 5-ть копеек туда куда не нужно...
учись писать правильно
цикл у тебя срабатывает, когда операция не удаётся
даже если ты вставил там проверку, это всё равно никакой подход

Цитата Сообщение от -=ЮрА=-
удосужся хотябы скомпилировать мой код и запустить
а зачем, я и так вижу, как он работает
я просто могу это представить

ты когда-то писал такое:
C
1
2
    char *p = malloc(1);
    strcpy(p, "abcd");
и аргументировал это тем, что код работает
Yandex
Объявления
27.10.2011, 09:36     В символьной строке удалить все слова, состоящие из нечетного количества букв.
Ответ Создать тему
Опции темы

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