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

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

Войти
Регистрация
Восстановить пароль
 
PG94
2 / 2 / 0
Регистрация: 15.01.2012
Сообщений: 181
#1

Для строки объединить в отдельную строку все слова, имеющие заданную букву, разделив их одним пробелом - C++

25.11.2012, 12:26. Просмотров 490. Ответов 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
//Для  строки  объединить  в  отдельную  строку  все  слова,  имеющие  
//заданную  букву,  разделив  их  одним  пробелом. 
#include <iostream>
#include <cstring>
using namespace std;
#define L 80
void subcopy(char* to, char* from, int amount) //куда копируем, откуда и кол - во символов
{
    int i;
    for(i=0; i < amount; i++)
        *(to + i) = *(from + i);
}
void HasLetter(char* str, char* res, char letter) //подразумеваем, что длина строки str не превосходит длину res
{
    int lenr = 0;
    int lenw = 0;
    bool found = false; //присутствие данной буквы в слове
    int reg = (letter < 'A' + 26)? 'a' - 'A': 'A' - 'a';    //считаем, что регистр не важен
    //printf ("letter + reg = %c\n", letter + reg);
    int i;
    for(i=0; *(str + i); i++)
    {   
        found = (*(str + i) == letter || *(str + i) + reg == letter || found)? true: false;
        /*for(int k=lenw; k >= 0; k--)
            printf("%c", *(str + i - k));
        printf("___found = %d\n", found);*/ // для отладки
        if(*(str + i) == ' ')
        {   
            if(found)
            {
                subcopy(res + lenr, str + i - lenw, lenw + 1); 
                /*printf("write: ");
                for(int j=0; j < lenw + 1; j++)
                    printf("%c", *(str + i - lenw + j));
                printf("\n");*/
                lenr+= lenw + 1;
            }
            lenw = 0;
            found = false;
        }
        else
            lenw++;
    }
    if(found)
        subcopy(res + lenr, str + i - lenw, lenw + 1); //если в конце строки стоит подходящее слово, то копируем вместе с '\0'
    else
        if(lenr)
            *(str + lenr - 1) = '\0';   //если есть хотя бы 1 слово с данной буквой
        else
            *(str + lenr) = '\0';       //случай с пустой строкой
}
int main()
{
    char str[L], res[L];
    gets(str);
    HasLetter(str, res, 'a'); 
    puts(res);
    cin.get();
    return 0;
}
Подскажите, что нужно подправить? Спасибо.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.11.2012, 12:26
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Для строки объединить в отдельную строку все слова, имеющие заданную букву, разделив их одним пробелом (C++):

Напечатать в алфавитном порядке все слова из заданной строки, имеющие заданную длину n - C++
Пожалуйста, напишите программу по следующей задаче: Дана строка . Напечатать в алфавитном порядке все слова из заданной строки,...

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

Дана строка, в которой слова разделены одним пробелом. Найдите и выведите все слова указанной длины - C++
В итоге вышло, что если первое слово правильной длинны - выводит все слова в строке. Если нет - ничего не выводит. int main() { char...

Вывести строку, содержащую слова, разделенные одним пробелом и расположенные в алфавитном порядке - C++
Дана строка, состоящая из русских слов, набранных заглавными буквами и разделенных пробелами(одним или несколькими). Вывести строку,...

Вывести строку, содержащую слова, разделенные одним пробелом и расположенные в алфавитном порядке - C++
Дана строка, набранная из слов, набранных заглавными буквами и разделенных пробелами (одним или несколькими). Вывести строку, содержащую...

Вывести строку, содержащую слова, разделенные одним пробелом и расположенные в алфавитном порядке - C++
Дана строка, состоящая из русских слов, набранных заглавными бук-вами и разделенных пробелами (одним или несколькими). Вывести строку,...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BumerangSP
4286 / 1408 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
25.11.2012, 13:38 #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <cstring>
int main()
{
     char b[] = "string which has to be divided", s[100], *ss="s";
    char* str = strtok(b, " ,.!?;:");
     do {
         if (strstr(str,ss))
             {
                strcat(s,str);
                strcat(s," ");
             }
     } while (str = strtok(NULL," ,.!?;:"));
     std::cout<<s;
     return 0;
}
Добавлено через 5 минут
А нужно искать совпадение, даже если буквы в разном регистре?
1
PG94
2 / 2 / 0
Регистрация: 15.01.2012
Сообщений: 181
25.11.2012, 22:44  [ТС] #3
Спасибо, но меня больше интересует вариант, где библиотечные ф - ии используются по минимуму. Хочу найти ошибки в своей программе, но пока в упор не вижу, что же всё - таки не так.
P.S. важное условие: буквы разного регистра неразличимы
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.11.2012, 22:44
Привет! Вот еще темы с ответами:

Вывести строку, содержащую эти же слова, разделенные одним пробелом и расположенные в обратном порядке - C++
Здравствуйте. можете прокомментировать эту программу? #include &quot;stdafx.h&quot; #include &lt;string&gt; #include &lt;iostream&gt; using...

Вывести все слова из каждой строки, начинающиеся и заканчивающиеся на заданную букву и количество таких слов в каждой строке. - C++
Ребят, всем привет!; Помогите, пожалуйста, решить задачу со строками на С++; Даны две строки, содержащие не более 100 символов. ...

Последовательности следующих друг за другом пробелов заменить одним пробелом (т.е. удалить все пробелы, следующие непосредственно за пробелом) - C++
Последовательности следующих друг за другом пробелов заменить одним пробелом (т.е. удалить все пробелы, следующие непосредственно за...

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


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

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

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