Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.62/37: Рейтинг темы: голосов - 37, средняя оценка - 4.62
75 / 99 / 1
Регистрация: 01.10.2011
Сообщений: 177
1

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

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

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

Дана строка-предложение с избыточными пробелами между словами. Преобразовать ее так, чтобы между словами был ровно один пробел
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.10.2011, 09:15
Ответы с готовыми решениями:

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

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

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

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

26
Делаю внезапно и красиво
Эксперт С++
1310 / 1225 / 72
Регистрация: 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
Миниатюры
Преобразовать строку так, чтобы между словами был ровно один пробел  
Делаю внезапно и красиво
Эксперт С++
1310 / 1225 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
01.10.2011, 11:44 4
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Ниже Си реализация указанного задания
Замени printf на sprintf и разделяющий пробел добавь ТОЛЬКО между слов и тогда это будет реализация задания.
1
930 / 755 / 299
Регистрация: 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
Делаю внезапно и красиво
Эксперт С++
1310 / 1225 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
01.10.2011, 12:05 6
Цитата Сообщение от xAtom Посмотреть сообщение
for(sa = iter, sb = iter + 1; *sa; *sa++ = *sb++);
Происходят лишние копирования после нуль-терминанта. Не существенно, но всё же.
И по заданию необходимо использовать string.h.
1
75 / 99 / 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
Эксперт С++
5813 / 3464 / 356
Регистрация: 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
Эксперт С++
5813 / 3464 / 356
Регистрация: 08.02.2010
Сообщений: 7,448
01.10.2011, 17:21 12
-=ЮрА=-, никто не спорит, что strtok изменяет переданную ей строку
1
Делаю внезапно и красиво
Эксперт С++
1310 / 1225 / 72
Регистрация: 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
Делаю внезапно и красиво
Эксперт С++
1310 / 1225 / 72
Регистрация: 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
Миниатюры
Преобразовать строку так, чтобы между словами был ровно один пробел  
Делаю внезапно и красиво
Эксперт С++
1310 / 1225 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
01.10.2011, 19:34 18
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
какой пробел вконце
Да, ты прав. Просто обилие циклов меня смутило и не правильно алгоритм понял.
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
10877 / 6768 / 1619
Регистрация: 25.07.2009
Сообщений: 12,484
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
Делаю внезапно и красиво
Эксперт С++
1310 / 1225 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
01.10.2011, 20:20 20
Цитата Сообщение от easybudda Посмотреть сообщение
printf("String: ") > 0
Для чего эта проверка, которая всегда TRUE?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.10.2011, 20:20

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

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

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

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


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

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

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