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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.67
Nikolas9
0 / 0 / 0
Регистрация: 29.12.2011
Сообщений: 7
#1

Перенос первого слова в конец строки. - C++

29.12.2011, 22:50. Просмотров 1550. Ответов 14
Метки нет (Все метки)

Создать приложение, которое считывает строку текста и переносит первое сло*во в конец строки. Результат вывести на экран.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.12.2011, 22:50     Перенос первого слова в конец строки.
Посмотрите здесь:

Написать функцию выделения первого слова из строки C++
Перенос первых букв в конец слова C++
C++ Перенос буквы слова в конец.Кто-нибудь осилит?
C++ Перенос буквы в конец слова
Добавление слова «salut» после первого слова введенной строки C++
C++ Переместить первую букву слова в конец слова(Строки)
Замена первого слова из введенной строки на последовательность символов «*» C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ProNoooob
72 / 72 / 6
Регистрация: 14.10.2009
Сообщений: 121
30.12.2011, 01:37     Перенос первого слова в конец строки. #2
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
#include <string.h>
#include <Windows.h>
 
int main()
{
    char buf[100];
 
    printf("Enter string:\n");
    gets(buf);
 
    printf("\n%s %s\n", &buf[strlen(strtok(buf, " ")) + 1], buf);
        
    system("pause");
    return 0;
}
Считывает строку и выводит ее же, но с первым словом в конце.

П.С. На самом деле задача решается по другому. Я так понял нужно переставить слова в памяти, а затем вывести на экран.
Просто мне стало интересно, смогу ли я выполнить само условие в одну строчку программы.
rangerx
1931 / 1540 / 141
Регистрация: 31.05.2009
Сообщений: 2,905
30.12.2011, 02:15     Перенос первого слова в конец строки. #3
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
#include <iostream>
#include <cstring>
 
int main()
{
    const size_t size = 256;
    const char* delim = " ,.?!:;";
 
    char s[size];
    std::cout << "input string: ";
    std::cin.getline(s, size);
    std::cout << "source: " << s << std::endl;
 
    char* pch = s;
    while(*pch && std::strchr(delim, *pch)) ++pch;
 
    size_t count = 0;
    while(*(pch + count) && !std::strchr(delim, *(pch + count))) ++count;
 
    char* buf = new char[count];
    std::strncpy(buf, pch, count);
 
    std::memmove(pch, pch + count, std::strlen(pch + count));
    std::strncpy(s + std::strlen(s) - count, buf, count);
    delete[] buf;
 
    std::cout << "result: " << s << std::endl;
}
Dekio
Фрилансер
Эксперт С++
5837 / 1218 / 214
Регистрация: 23.11.2010
Сообщений: 3,378
Записей в блоге: 1
30.12.2011, 02:31     Перенос первого слова в конец строки. #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <string>
 
int main()
{
    std::string Str;
    std::cout<<"Enter string:"<<std::endl;
    std::getline(std::cin, Str);
    std::size_t end, beg = Str.find_first_not_of(" ,.?!:;");
    end = Str.find_first_of(" ,.?!:;",beg);
    Str += " "+Str.substr(beg, end - beg);
    Str.erase(beg, end - beg);
    std::cout<<Str<<std::endl;
    system("pause");
    return 0;
}
alkagolik
Заблокирован
30.12.2011, 06:14     Перенос первого слова в конец строки. #5
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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
 
void *swap ( char *str ) {
 
    uint8_t len = strlen( str );
    char buf[ len ];
    char *p = strchr( str, ' ' );
 
    if ( !p++ )
        return NULL;
    else {
        memmove ( buf, p, str + len - p );
        memmove ( buf + ( str + len - p), str, p - str );
        memmove ( str, buf, len );
    }
    return str;
}
 
int main( void )
{
    char str[] = "[(this)] is a string";
    char *p = swap( str );
 
    if ( !p )
        puts("oops");
    else
        puts( p );
    return 0;
}
greeezz
272 / 165 / 4
Регистрация: 10.07.2011
Сообщений: 441
30.12.2011, 07:00     Перенос первого слова в конец строки. #6
alkagolik, в строке 9 вашего кода происходит создание нединамического массива. Я так понимаю что это сделано умышленно. Вопрос, почему? Мои соображения в том что до вызова функции размер массива неизвестен. Значит для него надо динамически выделять память. Заранее спасибо.
alkagolik
Заблокирован
30.12.2011, 15:19     Перенос первого слова в конец строки. #7
Цитата Сообщение от greeezz Посмотреть сообщение
Вопрос, почему?
потому что назначение массива - хранить промежуточный результат. Конечный результат помещается в исходную область памяти как указано в ТЗ.
Цитата Сообщение от greeezz Посмотреть сообщение
Мои соображения в том что до вызова функции размер массива неизвестен. Значит для него надо динамически выделять память.
мыслите верно, но неверно . Будет правильным подходом создать массив константного размера, а вот уже константа должна зависеть от поставленной задачи. Нету смысла локать кучу при каждом вызове функции и тут же ее освобождать, лишняя работа, можно просто посчитать байты.
greeezz
272 / 165 / 4
Регистрация: 10.07.2011
Сообщений: 441
30.12.2011, 22:27     Перенос первого слова в конец строки. #8
alkagolik, я честно говоря НЕдопонял.
вот тут
Цитата Сообщение от alkagolik Посмотреть сообщение
uint8_t len = strlen( str );
вычесляется длина строки.
потом тут
Цитата Сообщение от alkagolik Посмотреть сообщение
char buf[ len ];
создается массив имещий только что вычесленную длинну.
получается что размер массива заранее неизвестен. одни раз там может быть 20 другой 10 например ?

Добавлено через 1 минуту
я незнаю откуда но у меня почемуто застряло в голове что нельзя так делать в С.
с чем я путаю ? не знаете ?
rangerx
1931 / 1540 / 141
Регистрация: 31.05.2009
Сообщений: 2,905
30.12.2011, 22:41     Перенос первого слова в конец строки. #9
Цитата Сообщение от greeezz Посмотреть сообщение
я незнаю откуда но у меня почемуто застряло в голове что нельзя так делать в С.
с чем я путаю ? не знаете ?
С С++? В C(точнее C99) так делать можно.
greeezz
272 / 165 / 4
Регистрация: 10.07.2011
Сообщений: 441
30.12.2011, 22:46     Перенос первого слова в конец строки. #10
Цитата Сообщение от rangerx Посмотреть сообщение
С С++? В C(точнее C99) так делать можно.
когда-то на этом форуме я написал программу и сослался на стандарт С99 что так делать можно.
а мне тут сказали что так делать нельзя потому что код будет не переносимым.
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
30.12.2011, 23:14     Перенос первого слова в конец строки. #11
Цитата Сообщение от greeezz Посмотреть сообщение
и сослался на стандарт С99 что так делать можно.
Да, это возможно! Это называется variable-length arrays http://ru.wikipedia.org/wiki/C99
http://codepad.org/6MES7IKI
Цитата Сообщение от greeezz Посмотреть сообщение
а мне тут сказали что так делать нельзя потому что код будет не переносимым.
Но лучше так не делать (В С++ это не возможно) http://codepad.org/9WjpRzHs
Как видите лучше использовать константы
alkagolik
Заблокирован
30.12.2011, 23:40     Перенос первого слова в конец строки. #12
Цитата Сообщение от greeezz Посмотреть сообщение
создается массив имещий только что вычесленную длинну.
получается что размер массива заранее неизвестен.
Цитата Сообщение от alkagolik Посмотреть сообщение
Будет правильным подходом создать массив константного размера, а вот уже константа должна зависеть от поставленной задачи.
ставим
опыт
C
1
2
3
4
5
6
7
8
9
10
int main( void )
{
    char str[] = "[(this)] is a string ";
    int i = 10;
    char *p = &str[ 0 ];
 
    while ( i-- )
        p = swap( p );
    return 0;
}
и смотрим в отладчике адрес начального элемента массива. Ставим второй
опыт
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
#include <string.h>
#include <stdint.h>
 
size_t const s = 40;
 
void *swap ( char *str ) {
 
    uint8_t len = strlen( str );
    char buf[ s ];
    char *p = strchr( str, ' ' );
 
    if ( !p++ )
        return NULL;
    else {
        memmove ( buf, p, str + len - p );
        memmove ( buf + ( str + len - p), str, p - str );
        memmove ( str, buf, len );
    }
    return str;
}
 
 
int main( void )
{
    char str1[] = "[(this)] is a string ";
    char str2[] = "[(this) 12 ";
    char str3[] = "[(this) 12 321 321 321 321 ";
    int i = 10;
    char *p = swap( str1 );
    p = swap( str2 );
    p = swap( str3 );
    return 0;
}
и видим тоже самое. Третий
опыт
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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
 
void *swap ( char *str ) {
 
    uint8_t len = strlen( str );
    char buf[ len ];
    char *p = strchr( str, ' ' );
 
    if ( !p++ )
        return NULL;
    else {
        memmove ( buf, p, str + len - p );
        memmove ( buf + ( str + len - p), str, p - str );
        memmove ( str, buf, len );
    }
    return str;
}
 
int main( void )
{
    char str1[] = "[(this)] is a string ";
    char str2[] = "[(this) 12 ";
    char str3[] = "[(this) 12 321 321 321 321 ";
    int i = 10;
    char *p = swap( str1 );
    p = swap( str2 );
    p = swap( str3 );
    return 0;
}
видим что адрес буфера меняется, но он не возрастает постоянно, а меняется в зависимости от выравнивания судя по всему (это предположения). В любом случае ОС разбирается как лучше разместить массив в стеке.

Добавлено через 9 минут
а про ключик -std=c99 я уже и забыл, он у меня порписан в гуе опциях линкера.
greeezz
272 / 165 / 4
Регистрация: 10.07.2011
Сообщений: 441
31.12.2011, 00:17     Перенос первого слова в конец строки. #13
go, да я знаю насчет variable-length arrays. Я знаю что такое в принципе возможно в С. сейчас просто пытаюсь для себя понять насколько это (... ка кбы выразиться..) резонно или корректно что ли.
alkagolik
Заблокирован
31.12.2011, 00:34     Перенос первого слова в конец строки. #14
Если понимаешь что у тебя в руках и как оно работает то и АК под диваном хранить корректно.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.12.2011, 00:40     Перенос первого слова в конец строки.
Еще ссылки по теме:

Записать строку из слов, которые состоят из букв первого слова строки C++
Написать программу добавления слова «hello» после первого слова введенной строки C++
C++ Написать программу добавления слова «hello» после первого слова введенной строки
Перенос букв в начало строки, а цифр в конец C++ C++
C++ Выделение первого слова из введенной строки и отображение его на экране

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

Или воспользуйтесь поиском по форуму:
greeezz
272 / 165 / 4
Регистрация: 10.07.2011
Сообщений: 441
31.12.2011, 00:40     Перенос первого слова в конец строки. #15
Цитата Сообщение от alkagolik Посмотреть сообщение
Если понимаешь что у тебя в руках и как оно работает то и АК под диваном хранить корректно.
Согласен! Можно сказать что мои вопросы в сторону этого мануала меня и двигают.
Yandex
Объявления
31.12.2011, 00:40     Перенос первого слова в конец строки.
Ответ Создать тему
Опции темы

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