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

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

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

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

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

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

Дана строка-предложение с избыточными пробелами между словами. Преобразовать ее так, чтобы между словами был ровно один пробел
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.10.2011, 09:15     Преобразовать строку так, чтобы между словами был ровно один пробел
Посмотрите здесь:
C++ Отредактировать текст так, чтобы между словами был ровно один пробел
Отредактировать текст так, чтобы между словами был ровно один пробел C++
Как сделать, чтобы в результате был пробел между именем и фамилией и отображалось отчество C++
Написать функцию, преобразующую строку символов так, что между словами всегда находится два пробела C++
Добавить пробел между словами C++
C++ Преобразовать строку так, чтобы буквы каждого слова были остортированы по возрастанию
C++ Преобразовать строку так, чтобы все буквы в ней были отсортированы по возрастанию
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
01.10.2011, 09:36     Преобразовать строку так, чтобы между словами был ровно один пробел #2
strtok по исходной строке и добавлять токены в новую через пробел. strcpy для добавления используй.
сперва подсчитай количество лишних пробелов в исходной строке, чтобы знать размер результирующей.
strlen для узнавания длины всей строки.

Добавлено через 1 минуту
Что это за функции, смотреть в MSDN.
-=ЮрА=-
Заблокирован
Автор 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;
}
Миниатюры
Преобразовать строку так, чтобы между словами был ровно один пробел  
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
01.10.2011, 11:44     Преобразовать строку так, чтобы между словами был ровно один пробел #4
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Ниже Си реализация указанного задания
Замени printf на sprintf и разделяющий пробел добавь ТОЛЬКО между слов и тогда это будет реализация задания.
xAtom
914 / 739 / 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;
}
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
01.10.2011, 12:05     Преобразовать строку так, чтобы между словами был ровно один пробел #6
Цитата Сообщение от xAtom Посмотреть сообщение
for(sa = iter, sb = iter + 1; *sa; *sa++ = *sb++);
Происходят лишние копирования после нуль-терминанта. Не существенно, но всё же.
И по заданию необходимо использовать string.h.
alex.-93
74 / 98 / 1
Регистрация: 01.10.2011
Сообщений: 177
01.10.2011, 13:18  [ТС]     Преобразовать строку так, чтобы между словами был ровно один пробел #7
Большое спасибо всем!!!
-=ЮрА=-
Заблокирован
Автор 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;
}
Миниатюры
Преобразовать строку так, чтобы между словами был ровно один пробел  
-=ЮрА=-
Заблокирован
Автор 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:Тебе подсказали не проверив а верней не зная то о чём пишут...

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

Не по теме:

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

Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,444
01.10.2011, 17:21     Преобразовать строку так, чтобы между словами был ровно один пробел #12
-=ЮрА=-, никто не спорит, что strtok изменяет переданную ей строку
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
01.10.2011, 17:35     Преобразовать строку так, чтобы между словами был ровно один пробел #13
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
вточности по заданию!
Лишний пробел в конце строки остался.
-=ЮрА=-
Заблокирован
Автор 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;
}
- так что можно выбирать тот вариант который по душе
Миниатюры
Преобразовать строку так, чтобы между словами был ровно один пробел  
-=ЮрА=-
01.10.2011, 17:39
  #15

Не по теме:

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

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

Добавлено через 54 секунды
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
если их больше чем один, их программа подрежит до одного, в задании говорилось убрать множественные пробелы
Если в начале строки много пробелов, твой вариант ни одного не оставит.
-=ЮрА=-
Заблокирован
Автор 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:Иди почитай о функциях для работы со строками в стиле Си и кончай нести ахинею...

Миниатюры
Преобразовать строку так, чтобы между словами был ровно один пробел  
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
01.10.2011, 19:34     Преобразовать строку так, чтобы между словами был ровно один пробел #18
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
какой пробел вконце
Да, ты прав. Просто обилие циклов меня смутило и не правильно алгоритм понял.
easybudda
Эксперт С++
9456 / 5469 / 927
Регистрация: 25.07.2009
Сообщений: 10,495
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;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.10.2011, 20:20     Преобразовать строку так, чтобы между словами был ровно один пробел
Еще ссылки по теме:
Преобразовать массив так, чтобы между 0 ограничивающими первый отрезок, оказались элементы второго отрезка C++
Удалить в строке лишние пробелы, оставив между словами ровно по одному C++
C++ В строке между словами вставить вместо пробела запятую и пробел
C++ В строке между словами вставить вместо пробела запятую и пробел
C++ Азбука Морзе, добавить пробел между словами при декодировании

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

Или воспользуйтесь поиском по форуму:
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
01.10.2011, 20:20     Преобразовать строку так, чтобы между словами был ровно один пробел #20
Цитата Сообщение от easybudda Посмотреть сообщение
printf("String: ") > 0
Для чего эта проверка, которая всегда TRUE?
Yandex
Объявления
01.10.2011, 20:20     Преобразовать строку так, чтобы между словами был ровно один пробел
Ответ Создать тему
Опции темы

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