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

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

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

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

01.10.2011, 09:15. Просмотров 3356. Ответов 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, 09:36 #2
strtok по исходной строке и добавлять токены в новую через пробел. strcpy для добавления используй.
сперва подсчитай количество лишних пробелов в исходной строке, чтобы знать размер результирующей.
strlen для узнавания длины всей строки.

Добавлено через 1 минуту
Что это за функции, смотреть в MSDN.
1
-=ЮрА=-
Заблокирован
Автор FAQ
01.10.2011, 10:57 #3
Цитата Сообщение от alex.-93 Посмотреть сообщение
При реализации программы необходимо использовать функции обработки строк из библиотек stdlib.h и string.h
Дана строка-предложение с избыточными пробелами между словами. Преобразовать ее так, чтобы между словами был ровно один пробел
Ниже Си реализация указанного задания(программа позволяет много кратный ввод предложнияий)слова в которых разделёны множественными пробелами).
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
#include <stdio.h> //i/o
#include <string.h>//strtok
#include <conio.h> //getch
 
int main()
{
    char delim[] = " ";//Разделители между токенами (их можно добавить ,.!?)
    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 = strtok(str,delim);
        while(buf)
        {
            printf("%s ",buf);
            buf = strtok(NULL,delim);
        }
        printf("\r\nPress \'y\' for new input\r\n");
    }
    while(getch() == 'y');
 
    return 0;
}
1
Миниатюры
Преобразовать строку так, чтобы между словами был ровно один пробел  
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
01.10.2011, 11:44 #4
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Ниже Си реализация указанного задания
Замени printf на sprintf и разделяющий пробел добавь ТОЛЬКО между слов и тогда это будет реализация задания.
1
xAtom
915 / 740 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
01.10.2011, 11:48 #5
alex.-93, держи.
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
#include <stdio.h>
char* unique_space(char* str);
 
int  main(void) {
   char  str[] = "   Lisp      Actor         PL/I, Algol    .";
   puts( unique_space(str) );
   getchar();
   return 0;
}
 
char* unique_space(char* str) {
   char* iter, *sa, *sb;
   int cnt = 0;
   iter = str;
   do {
       if(*iter == ' ') cnt++;
       else {
           iter -= cnt;
           while(--cnt >= 1)
                 for(sa = iter, sb = iter + 1; *sa; *sa++ = *sb++);
           cnt = 0;
       }
   } while( *iter++ );
   return str;
}
1
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
01.10.2011, 12:05 #6
Цитата Сообщение от xAtom Посмотреть сообщение
for(sa = iter, sb = iter + 1; *sa; *sa++ = *sb++);
Происходят лишние копирования после нуль-терминанта. Не существенно, но всё же.
И по заданию необходимо использовать string.h.
1
alex.-93
74 / 98 / 1
Регистрация: 01.10.2011
Сообщений: 177
01.10.2011, 13:18  [ТС] #7
Большое спасибо всем!!!
0
-=ЮрА=-
Заблокирован
Автор FAQ
01.10.2011, 16:52 #8
alex.-93, смотри реализацию своего алгоритма вточности по заданию!
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
#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,' ');//Продолжаем следующих пробелов между словами
        }
        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;
}
1
Миниатюры
Преобразовать строку так, чтобы между словами был ровно один пробел  
-=ЮрА=-
Заблокирован
Автор FAQ
01.10.2011, 17:04 #9
alex.-93, по твоему вопросу что такое токен
Токен это подстрока в исходной строке(в общем это не слово, а участок символов строки ограниченных символами из
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
char delim[] = " ";
)Если бы мы написали char delim[] = " ,.&!"; то выделяли бы из строки все слова. В реализации приведенной мной во 2-м посте strtok будет возвращать такие токены: слово слово, слово. слово! и т.д...

Добавлено через 9 минут
b]alex.-93[/b], ни в коем случае никогда так не делай
Цитата Сообщение от Deviaphan Посмотреть сообщение
Замени printf на sprintf и разделяющий пробел добавь ТОЛЬКО между слов и тогда это будет реализация задания.
- strtok небезопасная функция, которая УНИЧТОЖАЕТ исходную строку, работая c ней после вызова strtok можешь вызвать непредсказуемое поведение приложения!
Так НИКОГДА НЕ ДЕЛАЙ!
C++
1
2
3
4
5
6
buf = strtok(str,delim);
while(buf)
        {
            sprintf(str, "%s ",buf);
            buf = strtok(NULL,delim);
        }

Не по теме:

PS:Тебе подсказали не проверив а верней не зная то о чём пишут...

1
Nameless One
Эксперт С++
5775 / 3425 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
01.10.2011, 17:06 #10
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
strtok небезопасная функция, которая УНИЧТОЖАЕТ исходную строку, работая c ней после вызова strtok можешь вызвать исключительную ситуацию и непредсказуемое поведение приложения!
взрослые дяди делают копию строки и не парятся...
1
-=ЮрА=-
01.10.2011, 17:15
  #11

Не по теме:

Цитата Сообщение от Nameless One Посмотреть сообщение
взрослые дяди делают копию строки и не парятся...
в задании говориться об исходной строке, для варианта со strtok по меньшей мере нужен будет буфер для накопления sprintf(BUFER, "%s ",buf); а затем из него делать перекопировку в исходную строку которая после работы strtok будет "уничтожена", это формально будет по заданию, а фактически мы не исходную строку преобразуем а уничтожим её и "создадим" вновь...

1
Nameless One
Эксперт С++
5775 / 3425 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
01.10.2011, 17:21 #12
-=ЮрА=-, никто не спорит, что strtok изменяет переданную ей строку
1
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
01.10.2011, 17:35 #13
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
вточности по заданию!
Лишний пробел в конце строки остался.
1
-=ЮрА=-
Заблокирован
Автор FAQ
01.10.2011, 17:36 #14
alex.-93, чтоб уж привести и вариант упомянутый
Nameless One, привожу код(он тоже полностью функционален)
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
#include <stdio.h> //i/o
#include <string.h>//strtok
#include <conio.h> //getch
 
int main()
{
    char delim[] = " ";//Разделители между токенами (их можно добавить ,.!?)
    char BUF[1025]={0};
    char str[1025]={0};//Думаю предложение(я) поменьше будут 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 = strtok(str,delim);
        sprintf(BUF, "%s",buf);
        while(buf)
        {
            sprintf(BUF, "%s %s",BUF, buf);
            buf = strtok(NULL,delim);
        }
        printf("%s",strcpy(str,BUF));
        printf("\r\nPress \'y\' for new input\r\n");
    }
    while(getch() == 'y');
 
    return 0;
}
- так что можно выбирать тот вариант который по душе
0
Миниатюры
Преобразовать строку так, чтобы между словами был ровно один пробел  
-=ЮрА=-
01.10.2011, 17:39     Преобразовать строку так, чтобы между словами был ровно один пробел
  #15

Не по теме:

Цитата Сообщение от Deviaphan Посмотреть сообщение
ишний пробел в конце строки остался.
- исходная строка его содержит ну вот пусть будет, если их больше чем один, их программа подрежит до одного, в задании говорилось убрать множественные пробелы

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.10.2011, 17:39
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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