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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 24, средняя оценка - 4.79
alex.-93
74 / 98 / 1
Регистрация: 01.10.2011
Сообщений: 177
#1

Преобразовать строку так, чтобы между словами был ровно один пробел - C++

01.10.2011, 09:15. Просмотров 3370. Ответов 26
Метки нет (Все метки)

При реализации программы необходимо использовать функции обработки строк из библиотек stdlib.h и string.h

Дана строка-предложение с избыточными пробелами между словами. Преобразовать ее так, чтобы между словами был ровно один пробел
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.10.2011, 09:15
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Преобразовать строку так, чтобы между словами был ровно один пробел (C++):

Отредактировать текст так, чтобы между словами был ровно один пробел - C++
:wall:Люди, плз помогите с задачами : № 1. Даны две символьные строки, состоящие только из цифр (длина каждой - более 10 символов)....

Отредактировать текст так, чтобы между словами был ровно один пробел - C++
помогите решить задачу. Дан произвольный текст.Отредактировать его так,чтобы: а)Между словами был ровно 1 пробел; б)предложения в...

Как сделать, чтобы в результате был пробел между именем и фамилией и отображалось отчество - C++
Доброго времени суток! Я только начинаю изучать язык C++ и столкнулся со сложностью в написании одной программы. Нужно, чтобы после...

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

Добавить пробел между словами - C++
проблема, как добавить в конце проги чтобы было пробела между словами #include <stdafx.h> #include <stdlib.h> int main() { ...

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

26
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
01.10.2011, 18:29 #16
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
исходная строка его содержит ну вот пусть будет
Напиши строку без пробела в конце и в результирующей всё-равно в конце пробел будет.

Добавлено через 54 секунды
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
если их больше чем один, их программа подрежит до одного, в задании говорилось убрать множественные пробелы
Если в начале строки много пробелов, твой вариант ни одного не оставит.
0
-=ЮрА=-
Заблокирован
Автор FAQ
01.10.2011, 19:17 #17
Цитата Сообщение от Deviaphan Посмотреть сообщение
Напиши строку без пробела в конце и в результирующей всё-равно в конце пробел будет.
- какой пробел вконце, вот тебе код показывающий есть пробел или нет его, после цикла вконце строки дописываю '!'.

На компилируй
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
#include <stdio.h> //i/o
#include <string.h>//strchr strlen
#include <conio.h> //getch
 
int main()
{
    long sLen,bLen,i;
    char str[1025];//Думаю предложение(я) поменьше будут 1024 символов
    char *buf;//Для частей строки и прочих нужд
    do
    {
        printf("Enter sentence(s) less than 1024 chars:\r\n");
        scanf("%[^\n]",str,&buf);//В str текст до '\n' в buf '\n'
        
        printf("Removing numerous spaces\r\n");
 
        buf = strchr(str,' ');
        while(buf)
        {
            sLen = strlen(str);//В sLen длину строки
            bLen = strlen(buf);
            i = 1;
            while(buf + i)
            {
                //Последовательно проверяем каждй символ после пробела
                if((buf + i)[0] == ' ')
                    i++;
                else
                    break;
            }
            //Копирование внутри строки
            strcpy(&str[sLen - bLen + 1],&str[sLen - bLen + i]);
            str[sLen - i + 1] = '\0';//Подрезаем исхоную строку на величину убранных пробелов
            buf = strchr(buf + 1,' ');//Продолжаем следующих пробелов между словами
        }
        str[sLen] = '!';
        printf("\r\n\tInput string after removing spaces\r\n%s",str);
        printf("\r\nPress \'y\' for new input\r\n");
    }
    while(getch() == 'y');
 
    return 0;
}


Не по теме:

PS:Иди почитай о функциях для работы со строками в стиле Си и кончай нести ахинею...

0
Миниатюры
Преобразовать строку так, чтобы между словами был ровно один пробел  
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
01.10.2011, 19:34 #18
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
какой пробел вконце
Да, ты прав. Просто обилие циклов меня смутило и не правильно алгоритм понял.
0
easybudda
Модератор
Эксперт CЭксперт С++
9698 / 5648 / 964
Регистрация: 25.07.2009
Сообщений: 10,863
01.10.2011, 20:13 #19
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 <string.h>
#include <ctype.h>
 
#define STR_LEN 512
#define STR_MASK "%511[^\n]%*c"
 
int main(void){
    char buf[STR_LEN], * p;
    
    while ( printf("String: ") > 0 && scanf(STR_MASK, buf) == 1 ){
        for ( p = buf; *p; ++p ){
            if ( isspace(*p) ){
                *p = ' ';
                while ( isspace(*(p+1)) )
                    memmove(p+1, p+2, strlen(p+1));
            }
        }
        
        printf("Result: %s\n", buf);
    }
    
    return 0;
}
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
01.10.2011, 20:20 #20
Цитата Сообщение от easybudda Посмотреть сообщение
printf("String: ") > 0
Для чего эта проверка, которая всегда TRUE?
0
-=ЮрА=-
01.10.2011, 20:22
  #21

Не по теме:

Пишу лишь с целью дискусси об эффективности

Цитата Сообщение от easybudda Посмотреть сообщение
hile ( isspace(*(p+1)) )
* * * * * * * * * * * * * * * * * * * * memmove(p+1, p+2, strlen(p+1));
- думаю проще всё же подсчитать число пробелов, а потом уж сдвинуть блок памяти (на каждом пробеле двигать полстроки думаю менее эффективно)
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
while(buf + i)
* * * * * * * * * * * * {
* * * * * * * * * * * * * * * * //Последовательно проверяем каждй символ после пробела
* * * * * * * * * * * * * * * * if((buf + i)[0] == ' ')
* * * * * * * * * * * * * * * * * * * * i++;

1
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
01.10.2011, 20:22 #22
Всё, вроде понял.)
1
easybudda
01.10.2011, 20:49
  #23

Не по теме:

Цитата Сообщение от Deviaphan Посмотреть сообщение
Для чего эта проверка, которая всегда TRUE?
С чего бы ей всегда true быть? На самом деле printf() может вернуть отрицательное значение, если с консолью в системе не комильфо. Оно, конечно, редкость, и в учебных программах можно было бы не заморачиваться, но есть другое мнение, к тому же формально с проверкой действительно правильнее.

1
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
02.10.2011, 07:57 #24
Цитата Сообщение от easybudda Посмотреть сообщение
С чего бы ей всегда true быть?
Цитата Сообщение от Deviaphan Посмотреть сообщение
Всё, вроде понял.)
Но ЮрА успел втиснуться.)
Но мне, всё равно, чисто по стилю такая запись не нравится (printf и scanf в одной строке). Делает геморной отладку.
1
easybudda
Модератор
Эксперт CЭксперт С++
9698 / 5648 / 964
Регистрация: 25.07.2009
Сообщений: 10,863
02.10.2011, 13:40 #25
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
лишь с целью дискусси об эффективности
код мной был написан по принципу наименьшей замороченности. Оптимизировать его можно до второго пришествия, но это будет совсем другой код. Так проще было, потому так и сделал, эффективностью не озадачивался - работает, да и ладно.


Цитата Сообщение от Deviaphan Посмотреть сообщение
Но мне, всё равно, чисто по стилю такая запись не нравится (printf и scanf в одной строке). Делает геморной отладку.
Не знаю, с какого бока вы там что отлаживаете, что на таких вещах сложности вызывает, в плане наглядности по-моему так значительно лучше. Условие while - практически встроенная функция, которая выдаёт запрос пользователю и возвращает ввод.
1
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
02.10.2011, 14:07 #26
Цитата Сообщение от easybudda Посмотреть сообщение
Не знаю, с какого бока вы там что отлаживаете
Ошибка может произойти и в printf и в scanf. Как узнать в какой из них, если они в одной строке? Т.е не входя внутрь этих функций, кода которых нет. Я об этом говорю. Надуманная проблема.)
1
SweenyTodd
0 / 0 / 0
Регистрация: 16.09.2015
Сообщений: 1
16.09.2015, 20:49 #27
Дана строка-предложение с избыточными пробелами между словами. Преобразовать ее так, чтобы между словами был ровно один пробел.
Может кто знает, как эту задачу решить используя классы? Такое задание от препода поступило...
0
16.09.2015, 20:49
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.09.2015, 20:49
Привет! Вот еще темы с ответами:

Преобразовать строку так, чтобы буквы каждого слова были остортированы по возрастанию - C++
Подскажите идею,как можно преобразовать строку так,чтобы буквы каждого слова были остортированы по возрастанию?

Преобразовать массив так, чтобы между 0 ограничивающими первый отрезок, оказались элементы второго отрезка - C++
&quot;В последовательности А из N элементов каждую группу из рядом стоящих нулей заменить одним нулем . Среди отрезков последовательности ,...

Удалить в строке лишние пробелы, оставив между словами ровно по одному - C++
Дана строка состоящая из слов, между которыми есть некое количество пробелов. Требуется удалить лишние пробелы, оставив между словами...

В строке между словами вставить вместо пробела запятую и пробел - C++
как в строке между словами вставить вместо пробела запятую и пробел? Добавлено через 2 минуты на с++.


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

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

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