| 
| 
 | Вопрос # 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) Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |