Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.01.2013, 22:14   #1
voodooism
 
Регистрация: 23.01.2013
Сообщений: 6
По умолчанию Вывести на экран строки, меняя местами два соседних слова

Задание:
Цитата:
Даны две строки, содержащие не более 100 символов. Строки состоят из слов, разделенных пробелами. Вывести на экран эти строки, меняя местами два соседних слова.
Из задания я понял что должен быть массив строк str[2][100].
C массивами у меня плохо, со строками тем более
Пока что написал код для одной строки:
Код:
#include <iostream>
#include <string>
#include <conio.h>
#include <stdio.h>
#include <Windows.h>
using namespace std;
int main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
char str1[100], *str1t[100], *tmp;
cout<<"Введите текст строки:"<<endl;
fgets(str1, sizeof(str1), stdin);
int j=0,i;
str1t[j]=strtok(str1, " ");
	while (str1t[j]!=NULL)
	{
		j++;
		str1t[j]=strtok(NULL," ");
	}

for(i=0;i<j-1;i++)
	{
		tmp=str1t[i];
		str1t[i]=str1t[i+1];
		str1t[i+1]=tmp;
		i++;
	}

for(i=0;i<j;i++)
	cout<<str1t[i]<<"\t";
cout<<endl;
system("pause");
return 0;
}
Он работает, но как видно на прикрепленной картинке - работает криво. Последнее слово почему то съезжает вниз.

Начал думать над тем как сделать тоже самое, но только с массивом строк. Получилось вот что:
Код:
#include <iostream>
#include <string>
#include <conio.h>
#include <stdio.h>
#include <Windows.h>
using namespace std;
int main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
int i,j=0;
char str1[2][100], *str1t[100], *tmp;
for(i=0;i<2;i++)
	{
		cout<<"Введите текст строки:"<<endl;
		fgets(str1[i], sizeof(str1), stdin);
	}
//Вывод исходного массива строк:
for(i=0;i<2;i++)
	cout<<str1[i]<<endl;
//Попытка написать цикл который будет разделять каждую строку на слова и записывать их в новый массив
for(i=0;i<2;i++)
	{
		str1t[i]=strtok(str1[i], " ");
		while(str1t[i]!=NULL)
			{
				i++;
				str1t[i]=strtok(NULL, " ");
			}
	}
//Смотрим что получилось(точнее не получилось)
for(j=0;j<i;j++)
	cout<<str1t[j]<<"\t";
cout<<endl;

system("pause");
return 0;
}
Код ессно работает( вставляю суда, чтобы было понятнее в каком направлении я думаю). В результате работы первую строку он разделяет на слова, а на второй выдает ошибку. Помогите, пожалуйста.
Изображения
Тип файла: jpg p7dUqnN.jpg (16.5 Кб, 93 просмотров)

Последний раз редактировалось voodooism; 23.01.2013 в 22:16.
voodooism вне форума Ответить с цитированием
Старый 23.01.2013, 22:52   #2
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

strtok возвращает адрес первого символа в слове.
По сути надо просто запоминать всего два адреса четных и нечетных слов, и выводить в обратном порядке.
ЗЫ. Точнее запоминать надо только четное, а вывод -текущее нечетное и вслед за этим сохраненное четное.
А Вы опять все в промежуточные массивы запихиваете.

Последний раз редактировалось EUGY; 23.01.2013 в 23:00.
EUGY вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Дана строка слов,отделённых пробелом,в конце строки точка.поменять местами два центральных слова Dima170792 Помощь студентам 4 05.05.2011 23:04
строки на Си. поменять местами каждые 2 соседних слова alex(21) Фриланс 5 08.12.2010 12:02
Найти слова, состоящие только из согласных букв и вывести их на экран Кипятилка Паскаль, Turbo Pascal, PascalABC.NET 5 29.06.2009 18:52
Сложить два числа и вывести результат на экран We1c0m3 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 23.05.2009 11:41