Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 5 674

Раздел: C++
/ вопрос решён /

Доброго времени суток, уважаемые эксперты!
Есть такое задание: требуется поменять в строке местами первое и второе слово. Гарантируется, что в строке не более 20 слов, слова разделены пробелами.
В чем, собственно проблема: я не могу решить, каким алгоритмом правильнее/лучше решать. На ум приходят такие варианты:
1) Разбить строку на слова с помощью strtok(str, " "), попутно создав массив указателей на каждое слово. При выводе просто поменять местами 1 и 2 указатели. Но в таком случае сама строка не меняется.
2) По символьно найти первое и второе слово и сформировать новую строку, с уже поменяными слова. Но как-то это геморройно, что-ли.
3) Через аналоги дельфийский функций pos() и delete(), (последней я, кстати, не нашел, она существует вообще?). Таким способом задача решалась бы элементарно, но что-то на си пока не получается перенести.
Заранее спасибо.

Приложение:
  1. C, NetBeans 7.1


IlluminatI Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: 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™

min@y™ (статус: Доктор наук), 13 октября 2011, 13:25 [#1]:

Цитата (min@y™):

Оценка за ответ: 5

Чо, работает?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
IlluminatI

IlluminatI (статус: 2-ой класс), 13 октября 2011, 16:03 [#2]:

Не совсем. У меня просто массив строк, и он валится где-то. Не могу настроить в Нет Бинсе сраный отладчик - он постоянно при запуске в отладке ставит какую-то "строку стека вызовов" и все! И код не хочет выпоняться.
Пятерка за идею - код-то я бы реализовал :)
IlluminatI

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

IlluminatI (статус: 2-ой класс), 13 октября 2011, 16:25 [#4]:

Все, разобрался. Спасибо. Забыл выделить память под буфер :) .

13 октября 2011, 16:26: Статус вопроса изменён на решённый (изменил автор вопроса — IlluminatI)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:33
Выполнено за 0.03 сек.