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

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

Восстановить пароль Регистрация
 
PG94
2 / 2 / 0
Регистрация: 15.01.2012
Сообщений: 181
25.11.2012, 12:26     Для строки объединить в отдельную строку все слова, имеющие заданную букву, разделив их одним пробелом #1
Доброго времени суток.
Никак не получается отладить данную программу с учётом того, что буквы разного регистра неразличимы.
Вот код с небольшими комментариям.
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;
}
Подскажите, что нужно подправить? Спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.11.2012, 12:26     Для строки объединить в отдельную строку все слова, имеющие заданную букву, разделив их одним пробелом
Посмотрите здесь:

C++ Распечатать все слова из каждой строки, начинающиеся и заканчивающиеся на заданную букву.
C++ Напечатать в алфавитном порядке все слова из заданной строки, имеющие заданную длину n
C++ Вывести строку, содержащую слова, разделенные одним пробелом и расположенные в алфавитном порядке
Вывести все слова из каждой строки, начинающиеся и заканчивающиеся на заданную букву и количество таких слов в каждой строке. C++
Вывести строку, содержащую слова, разделенные одним пробелом и расположенные в алфавитном порядке C++
Вывести из файла все слова, которые начинаются на заданную букву C++
C++ Дана строка, в которой слова разделены одним пробелом. Найдите и выведите все слова указанной длины
Удалить из текста все слова с удвоением букв и записать их в отдельную строку C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
BumerangSP
 Аватар для BumerangSP
4283 / 1405 / 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 минут
А нужно искать совпадение, даже если буквы в разном регистре?
PG94
2 / 2 / 0
Регистрация: 15.01.2012
Сообщений: 181
25.11.2012, 22:44  [ТС]     Для строки объединить в отдельную строку все слова, имеющие заданную букву, разделив их одним пробелом #3
Спасибо, но меня больше интересует вариант, где библиотечные ф - ии используются по минимуму. Хочу найти ошибки в своей программе, но пока в упор не вижу, что же всё - таки не так.
P.S. важное условие: буквы разного регистра неразличимы
Yandex
Объявления
25.11.2012, 22:44     Для строки объединить в отдельную строку все слова, имеющие заданную букву, разделив их одним пробелом
Ответ Создать тему
Опции темы

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