|
Вопрос # 5 674/ вопрос решён / |
|
Доброго времени суток, уважаемые эксперты!
Есть такое задание: требуется поменять в строке местами первое и второе слово. Гарантируется, что в строке не более 20 слов, слова разделены пробелами.
В чем, собственно проблема: я не могу решить, каким алгоритмом правильнее/лучше решать. На ум приходят такие варианты:
1) Разбить строку на слова с помощью strtok(str, " "), попутно создав массив указателей на каждое слово. При выводе просто поменять местами 1 и 2 указатели. Но в таком случае сама строка не меняется.
2) По символьно найти первое и второе слово и сформировать новую строку, с уже поменяными слова. Но как-то это геморройно, что-ли.
3) Через аналоги дельфийский функций pos() и delete(), (последней я, кстати, не нашел, она существует вообще?). Таким способом задача решалась бы элементарно, но что-то на си пока не получается перенести.
Заранее спасибо.
 |
Вопрос задал: IlluminatI (статус: 2-ой класс)
Вопрос отправлен: 13 октября 2011, 00:32
Состояние вопроса: решён, ответов: 1.
|
Ответ #1. Отвечает эксперт: min@y™
Ну, как-то так:
#include <cstdlib>
#include <iostream>
#include <string.h>
using namespace std;
void ExchangeWords(char* s, char* buffer)
{
char* w1 = strtok(s, " ");
if (!w1) return;
s += strlen(w1) + 1;
char* w2 = strtok(NULL, " ");
if (!w2) return;
s += strlen(w2) + 1;
strcpy(buffer, w2);
strcat(buffer, " ");
strcat(buffer, w1);
strcat(buffer, " ");
strcat(buffer, s);
}
int main(int argc, char *argv[])
{
char S[] = "Word1 Word2 Word3 Word4 Word5 Word6 Word7 Word8";
char Buffer[256];
printf("S = %s\n", S);
ExchangeWords(S, Buffer);
printf("buffer = %s\n", Buffer);
system("PAUSE");
return EXIT_SUCCESS;
}
 |
Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 13 октября 2011, 09:00
Оценка за ответ: 5
|
Мини-форум вопроса
Всего сообщений: 4; последнее сообщение — 13 октября 2011, 16:25; участников в обсуждении: 2.
|
min@y™ (статус: Доктор наук), 13 октября 2011, 13:25 [#1]:
Цитата (min@y™):
Оценка за ответ: 5
Чо, работает?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
IlluminatI (статус: 2-ой класс), 13 октября 2011, 16:03 [#2]:
Не совсем. У меня просто массив строк, и он валится где-то. Не могу настроить в Нет Бинсе сраный отладчик - он постоянно при запуске в отладке ставит какую-то "строку стека вызовов" и все! И код не хочет выпоняться.
Пятерка за идею - код-то я бы реализовал
|
|
IlluminatI (статус: 2-ой класс), 13 октября 2011, 16:12 [#3]:
Дело не в массиве строк. Переделал без функции, вот так:
int main(void) {
char s[] = "one two three four five";
puts(s);
printf("\n----\n");
char *buff;
char *w1 = strtok(s, " ");
if (!w1)
return 1; // fail
*s += strlen(w1) + 1;
char *w2 = strtok(NULL, " ");
if (!w2)
return 1;// fail
*s += strlen(w2) + 1;
strcpy(buff, w2);
strcat(buff, " ");
strcat(buff, w1);
strcat(buff, " ");
strcat(buff, s);
return 0;
}
Из-за отладчика не могу найти ошибку.
|
|
IlluminatI (статус: 2-ой класс), 13 октября 2011, 16:25 [#4]:
Все, разобрался. Спасибо. Забыл выделить память под буфер .
|
13 октября 2011, 16:26: Статус вопроса изменён на решённый (изменил автор вопроса — IlluminatI)
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|