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

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

Войти
Регистрация
Восстановить пароль
 
D01phiN
0 / 0 / 0
Регистрация: 13.04.2012
Сообщений: 21
#1

Нестандартные функции (сжимающие строку) - C++

04.05.2012, 14:20. Просмотров 784. Ответов 10
Метки нет (Все метки)

Условие задачи.
Написать и протестировать функцию, которая "сжимает" строку, удаляя из неё все пробелы. Символьная строка вводится с клавиатуры. В программе можно использовать стандартную функцию strlen (имя строки) из <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
27
28
29
30
31
32
33
34
#include <stdio.h>
 
char* remove_spaces(char* s)
{
    int i = 0, j = 0;
 
    while(s[i] != '\0')
    {
        if(s[i] != ' ')
        {
            s[j] = s[i];
            ++j;
        }
 
        ++i;
    }
 
    s[j] = '\0';
 
    return s;
}
 
int main(void)
{
    char str[256] = "";
 
    printf("string: ");
    scanf("%255[^\n]", str);
 
    remove_spaces(str);
    printf("result: %s\n", str);
 
    return 0;
}
Ответ выводит неправильно. Приходится нажимать два раз ctrl+f9. Первый раз чтобы ввести строку. Второй раз, чтобы увидеть результат. Потому что после первого раза окно сворачивает на изначальное мною написанное условие задачи.

Добавлено через 10 минут
задача не сложная...с***, но ошибка есть...
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.05.2012, 14:20
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Нестандартные функции (сжимающие строку) (C++):

Нестандартные задания - C++
1)Условие: У вас есть несколько камней известного веса W1, …, Wn. Напишите программу, которая распределит камни в две кучи так, что...

Нестандартные бмблмотеки, которые работают со строками быстрее. - C++
Podskagite, pls, kakie, gde mogno vsyat'/kupit'... Proga postoyanno vipolnyaet ogromnoe kol-vo operaziy so strokami (ishet posiziu,...

Передать строку из функции - C++
нужно вернуть из функции строку???

Вернуть строку из функции. - C++
Как вернуть строку(AnsiString) из функции? int MyTXT (AnsiString Temlate, AnsiString tmp) { TSearchRec SR; int ires; ...

Функции, которые получают строку и int - C++
Здравствуйте! Пожалуйста, помогите написать: -функцию, которая получает значение int, -функцию, которая получает строку ...

Принять в параметр функции строку и вернуть ее же,но измененную - C++
Здравствуйте!Такая проблема:есть функция,принимающая в качестве аргумента строку и,проведя некоторые действия с ней,возвращает ее же,но...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
andy_111
90 / 59 / 2
Регистрация: 03.07.2011
Сообщений: 148
04.05.2012, 14:36 #2
А в чем неправильность, какую строку вводите? У меня вроде все норм...
1
D01phiN
0 / 0 / 0
Регистрация: 13.04.2012
Сообщений: 21
04.05.2012, 14:40  [ТС] #3
andy_111, значит нажимаю ctrl+f9(Run).
Появляется чёрный экран, там написано "string:"
Набираю строку и жму Enter. Сворачивается (Run) и появляется синий экран в котором я набирал саму программу. Жму опять ctrl+f9, а там моя строка, которую я вводил и уже в исправленном виде чуть ниже. Получается что программа решает, но приходится два раза нажимать (Run). А такого по моему не должно быть. Или я ошибаюсь?
0
andy_111
90 / 59 / 2
Регистрация: 03.07.2011
Сообщений: 148
04.05.2012, 14:44 #4
D01phiN, смотри, как можно сделать. Используешь getch() из conio.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
27
28
29
30
31
32
33
34
35
36
37
#include <stdio.h>
#include <conio.h>
 
char* remove_spaces(char* s)
{
    int i = 0, j = 0;
 
    while(s[i] != '\0')
    {
        if(s[i] != ' ')
        {
            s[j] = s[i];
            ++j;
        }
 
        ++i;
    }
 
    s[j] = '\0';
 
    return s;
}
 
int main(void)
{
    char str[256] = "";
 
    printf("string: ");
    scanf("%255[^\n]", str);
 
    remove_spaces(str);
    printf("result: %s\n", str);
 
   getch();
 
    return 0;
}
1
D01phiN
0 / 0 / 0
Регистрация: 13.04.2012
Сообщений: 21
04.05.2012, 14:51  [ТС] #5
Вот это да
Ты крутой программист
побежал сдавать, огромное спасибо за помощь
всего хорошего тебе

Добавлено через 2 минуты
и всем спасибо кто уделил своё внимание моей задаче.
0
-=ЮрА=-
Заблокирован
Автор FAQ
04.05.2012, 19:20 #6
D01phiN, посмотри алгоритм ниже(конечно если актуально конечно)
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
#include <stdio.h>  //i/o
#include <string.h> //strcpy
#include <stdlib.h> //system
 
char* remove_spaces(char* s)
{
    long i;
    if(s != NULL)//В цикл попадём только если передали строку
        //єто избавит нас от облома при передаче скажем пустого указателя и т.д.
    for(i = 0; s[i] != '\0'; i++)
    {
        if(s[i] == ' ')
        {
            if(s + i + 1 != NULL)
            {
                if(strcpy(&s[i],&s[i + 1]))//Только если сдвиг прошёл успешно
                    i = i - 1;//надо отъёхать назад т.к. на i - ую позицию 
                              //после strcpy стал i + 1 символ
            }
            else//пробел в самом конце строки
                s[i] = '\0';//обрезали его и не мучаемся
        }
    }
    return s;
}
 
 
int main()
{
    char text[1024] = {0};
    printf("Enter text (less than 1024 chars)\n");
    scanf("%1023[^\n]",text);
    printf("result: %s\n", remove_spaces(text));
    system("pause");//Забываем о гетч - она вне стандарта, юзаем system
    return 0;
}
1
Миниатюры
Нестандартные функции (сжимающие строку)  
D01phiN
0 / 0 / 0
Регистрация: 13.04.2012
Сообщений: 21
04.05.2012, 23:14  [ТС] #7
-=ЮрА=-, теперь нужна твоя помощь.
Или того кто сейчас просматривает эту тему. Я сходил показал ей работу.
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
#include <stdio.h>
#include <conio.h>
 
char* remove_spaces(char* s)
{
    int i = 0, j = 0;
 
    while(s[i] != '\0')
    {
        if(s[i] != ' ')
        {
            s[j] = s[i];
            ++j;
        }
 
        ++i;
    } //Вот досюда всё правильно. Она сказала что не хватает void main. Главной функции в данной задачи.
 
    s[j] = '\0';
 
    return s;
}
 
int main(void)
{
    char str[256] = "";
 
    printf("string: ");//Эту строку
    scanf("%255[^\n]", str);//И эту сказала заменить на одну gets(str);
 
    remove_spaces(str);//Эту строку
    printf("result: %s\n", str);?//И эту сказала заменить на puts(str);
 
   getch();
 
    return 0;
}
PS Если сделать как она сказала, то должно всё получится. А главное устроит её. У меня давно уже задача эта решена. Ещё как 2 месяца назад. Просто требовательный преподаватель очень. Хоть и 6 пар всего лишь у него было. До сих пор бегаем сдаём долги. Помогите пожалуйста. Завтра утром к ней пойду

Добавлено через 1 минуту
И ещё она сказала что
C++
1
char str[256] = "";//Вместо числа 256 можно любое поставить. Например 80.
У меня уже крыша едет. Ещё всю ночь сидеть считать расчётно-графическую.

Добавлено через 5 минут
аааа я не переписал в тетрадку "int main(void)"
Вот видимо главная функция. А почему так, а не void main??? Кто подскажет?
0
gray_fox
What a waste!
1520 / 1223 / 70
Регистрация: 21.04.2012
Сообщений: 2,560
Завершенные тесты: 3
04.05.2012, 23:25 #8
Цитата Сообщение от D01phiN Посмотреть сообщение
А почему так, а не void main
Потому что вообще в С/C++ точка входа в программу всегда или
C++
1
int main()
или
C++
1
int main(int argc, char * argv[])
всякие остальные void _tmain и пр. уже вещи специфические для конкретных компиляторов\платформ или ещё чего.

Добавлено через 5 минут
Цитата Сообщение от D01phiN Посмотреть сообщение
C++
1
2
3
4
printf("string: ");//Эту строку
scanf("%255[^\n]", str);//И эту сказала заменить на одну gets(str);
remove_spaces(str);//Эту строку
printf("result: %s\n", str);?//И эту сказала заменить на puts(str);
Ну попробуй тогда заменить на
C
1
2
gets(str);
puts(remove_spaces(str));
Но на будующее - никогда не используй gets(). Вообще странные какие-то требования для универа, и так работает же, не?)
1
D01phiN
0 / 0 / 0
Регистрация: 13.04.2012
Сообщений: 21
04.05.2012, 23:42  [ТС] #9
Она работает отлично. Сейчас исправлю. Не дай бог не заработает. У меня тут мыло с верёвкой уже рядом лежит.

Добавлено через 5 минут
Вот. Работает. Ладно. Спасибо всем. Кто поучаствовал.

gray_fox, можешь объяснить для чего тут нужно вообще
char* remove_spaces(char*s)?
Или вообще через // напротив строки, зачем она нужна. Просто ей одного решения мало. Нужно всё рассказать, про каждую запятую. Завтра нужно 100% сдать. Я конечно понимаю задачу. Но очень смутно. Боюсь не защитить(
0
gray_fox
What a waste!
1520 / 1223 / 70
Регистрация: 21.04.2012
Сообщений: 2,560
Завершенные тесты: 3
05.05.2012, 00:20 #10
Сумбурно:
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
#include <stdio.h>    /* стандартный заголовочный файл ввода\вывода,
                                        содержит объявления ф-й puts  gets */ 
#include <conio.h>        /* аналогично для getch */
 
char* remove_spaces(char* s) /* твоя ф-я для удаления пробелов из строки,
                                                 принимает и возвращает указатель на char */
{
    int i = 0, j = 0;                   /* индексы для строк, i - в исходной строке, j - в результате */
 
    while(s[i] != '\0')                /* цикл 'пока не символ конца строки' */
    {
        if(s[i] != ' ')                    /* если символ - не пробел */
        {
            s[j] = s[i];                  /* копируем символ */
            ++j;                           /* и сдвигаем индекс результата к следующему символу */
        }
 
        ++i;                               /* сдвигаем индекс в исходной строке */
    }
 
    s[j] = '\0';                          /* добавляем в конце символ конца строки */
 
    return s;                             /* возвращаем из ф-ии строку (С-строка - указатель на char + '\0' в конце) */
}
 
int main(void)             /* точка входа в приложение - отсюда начинается выполнение программы */
{
    char str[256] = ""; /* объявляем массив из char на 256 символов - здесь будет хранится строка */
 
    gets(str);              /* читаем из stdin (с консоли) строку (максимум из 255 символов,
                                    иначе - ошибка - места в str не хватит) */
 
    remove_spaces(str); /* вызов твоей ф-ии, в результате в str строка без пробелов  */
    puts(str);                 /* выводим в stdout (на консоль) str + перевод строки */
 
   getch();                    /* ждём нажатия любой клавиши */
 
    return 0;                  /* возвращаем из main 0 - признак успешного завершения программы */
}
1
D01phiN
0 / 0 / 0
Регистрация: 13.04.2012
Сообщений: 21
05.05.2012, 00:52  [ТС] #11
Спасибо большое. Помог сильно.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.05.2012, 00:52
Привет! Вот еще темы с ответами:

Как разделить строку(аналог функции explode) - C++
Есть строка string в которую записаны данные разделенные специальным разделителем например | Как разделить такую строку и записать...

Определить класс-строку. Предусмотреть функции поиска слова в строке - C++
Определить класс-строку. В класс включить два конструктора: для определения класса строки строкой символов и путем копирования другой...

работа со строками. Перевернуть, заданную пользователем строку, в отдельной функции - C++
задание- перевернуть, заданную пользователем строку, в отдельной функции; написал вот такой код, переворачиваю-&gt; копирую-&gt;вывожу ...

Ввести строку. Найти в функции в ней слово максимальной длины - C++
Как засунуть всю задачу в функцию, так что бы вызвать ее с помощью меню? Задача: Ввести строку. Найти в функции в ней слово максимальной...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
05.05.2012, 00:52
Ответ Создать тему
Опции темы

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