Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.62/26: Рейтинг темы: голосов - 26, средняя оценка - 4.62
0 / 0 / 0
Регистрация: 03.12.2010
Сообщений: 44

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

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

Студворк — интернет-сервис помощи студентам
Привет.
Нужна ваша помощь в написании проги на С. Не на С++ =)
Ниже приведено условие:
В символьной строке удалить все слова, состоящие из нечетного количества букв.
Всем "+" за помощь=) Спасибо.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.10.2011, 12:45
Ответы с готовыми решениями:

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

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

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

26
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
25.10.2011, 13:38
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
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
25.10.2011, 15:39
Очень давно хотел написать алгоритм чтобы выделять токены и не гробить исходную строку 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
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
25.10.2011, 15:52
easybudda,
Цитата Сообщение от easybudda Посмотреть сообщение
char buf[strlen(str) + 2]
- а такое в Visual Studio возможно или это для DevC???
0
Higher
 Аватар для diagon
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
25.10.2011, 16:02
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- а такое в Visual Studio возможно или это для DevC???
В С99 есть VLA. MSVC вроде не поддерживает C99.
1
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
25.10.2011, 16:19
Цитата Сообщение от diagon Посмотреть сообщение
MSVC вроде не поддерживает C99.
Во всяком случае VLA точно не поддерживает. В Dev С++ используется компилятор MinGW, то есть должно работать.
1
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
26.10.2011, 07:15
Цитата Сообщение от -=ЮрА=-
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;
}
Code
1
2
3
4
[guest@localhost tests]$ .ansi t.c -o t
[guest@localhost tests]$ ./t
-1
[guest@localhost tests]$
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
26.10.2011, 09:20
Цитата Сообщение от accept Посмотреть сообщение
sscanf() может вернуть EOF, который является истиной
- поетому в цикле есть допусловие выхода
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
if(sLen <= pos)
* * * * * * * * * * * * * * * * break;
accept, к чему ваш пост был???
0
 Аватар для xAtom
935 / 760 / 299
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
26.10.2011, 09:35
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
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
26.10.2011, 11:11
Цитата Сообщение от -=ЮрА=-
- поетому в цикле есть допусловие выхода
оно должно быть в заголовке, а так на EOF цикл начинает работать
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
26.10.2011, 13:18

Не по теме:

Цитата Сообщение от 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
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
26.10.2011, 13:48
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
он в плане объёма меньше вот тут только замените это
C
1
char buf[strlen(str) + 2],
на это
C
1
char buf[STR_LEN]
... и получите потенциальную дыру в коде. Как Вы думаете, почему там + 2 стоит?
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
26.10.2011, 14:25
Цитата Сообщение от easybudda Посмотреть сообщение
и получите потенциальную дыру в коде. Как Вы думаете, почему там + 2 стоит?
- я спешил поетому 2-ку унёс)Суть сводилось к строке buf константного размера я к этому dander, подводил
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
26.10.2011, 14:42
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Суть сводилось к строке buf константного размера
ну это да, только тогда лучше было бы
C
1
2
//...
    static char buf[STR_LEN + 1];
Суть дыры в том, что функция лишний пробел в конце строки лепит. При максимальном количестве символов 255 подайте на вход строку из 4 символов, пробела и ещё 250 символов - получится выход за границу. То есть буфер должен быть без учёта нуля на символ длиннее. Соответственно с учётом - на 2.
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
26.10.2011, 14:59
Цитата Сообщение от easybudda Посмотреть сообщение
Суть дыры в том, что функция лишний пробел в конце строки лепит.
- я этого не увидел(бегло смотрел код), но думаю, что и Вы и Я ответили ужеdander нормальными кодами. С учётом константного размера buf dander спокойно может реализовывать Ваш код с strtok-ами, он проще для объяснения преподу при здаче задания, свой код я приурачивал к исключению strtok-а и буфера, вот и всё
0
0 / 0 / 0
Регистрация: 03.12.2010
Сообщений: 44
26.10.2011, 17:48  [ТС]
вот скрин
в чем ошибка? =)
Миниатюры
В символьной строке удалить все слова, состоящие из нечетного количества букв.  
0
0 / 0 / 0
Регистрация: 03.12.2010
Сообщений: 44
26.10.2011, 18:32  [ТС]
easybudda,
да при выполнении программы в VS выдает ошибку
так что нужно исправить, что код работал VS&
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
27.10.2011, 02:10
-=ЮрА=-, сделай вот так
C
1
    while(sscanf(&str[pos],"%s",buf) == 1)
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
27.10.2011, 09:27
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-ть копеек туда куда не нужно...

0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
27.10.2011, 09:36
Цитата Сообщение от -=ЮрА=-
ну реально зачем вставляешь свои 5-ть копеек туда куда не нужно...
учись писать правильно
цикл у тебя срабатывает, когда операция не удаётся
даже если ты вставил там проверку, это всё равно никакой подход

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

ты когда-то писал такое:
C
1
2
    char *p = malloc(1);
    strcpy(p, "abcd");
и аргументировал это тем, что код работает
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.10.2011, 09:36
Помогаю со студенческими работами здесь

В символьной строке удалить все слова, состоящие из нечетного количества букв
Ребят помогите, не могу понять. Нужно, чтобы мусор не удаляло, а оставляло. Мусором считатется(*?^$#) такие символы #include...

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

В символьной строке сосчитать число слов, состоящих из нечётного количества букв
Пожалуйста,помогите с программой.Нужно в символьной строке сосчитать число слов, состоящих из нечётного количества букв.Сделал программу,но...

Нужно в строке удалить слова, состоящие из букв заданного слова
Задание такое: вводится слово и строка (отдельно). Нужно в строке удалить слова, состоящие из букв заданного слова, а остальные слова...

Напечатать все слова, состоящие из одинакового количества букв и цифр
напечатать все слова состоящие из одинакового количества букв и цифр


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru