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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.10.2012, 15:25   #1
Zaza7
 
Регистрация: 21.10.2012
Сообщений: 9
Вопрос Не получается перевернуть наоборот строку символьного массива.

Код:
#include <iostream>
#include <string>
using namespace std;
int main( )
{
    char S[10]={'O', 'p', 'p', 'a', 'P', 'o', 'p', 'a', '\0'};
    int i;
    char p;
    while (i<10/2)
    {
          p=S[i];
          S[i]=S[9-i];
          S[9-i]=p;
          i++;
          }
          i=0;
          for (i=0; S[i]!='\0'; i++)
          {
              printf("%c ", S[i]);
              }
              printf("%s ", S);
    return 0;
}
в результате получаю строку написанную 2 раза, а не перевернутую. Что не так делаю?

Последний раз редактировалось ACE Valery; 21.10.2012 в 15:48.
Zaza7 вне форума Ответить с цитированием
Старый 21.10.2012, 15:56   #2
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2Zaza7

переменную i используешь без инициализации.

так лучше:
Код:
#include <cstdio>
#include <cstring>

int main( )
{
	char str[] = "hello, world";

	for (int i = 0, l = strlen(str); i < l / 2; i++) {
		char c = str[i];
		str[i] = str[l - i - 1];
		str[l - i - 1] = c;
	}

	printf("%s\n", str);
	return 0;
}
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance

Последний раз редактировалось pproger; 21.10.2012 в 16:04.
pproger вне форума Ответить с цитированием
Старый 21.10.2012, 16:21   #3
three_cats
Форумчанин
 
Аватар для three_cats
 
Регистрация: 27.09.2012
Сообщений: 175
По умолчанию

Да зачем?

Вот:

Код:
#include <conio.h>
#include <iostream>
#include <string>
using namespace std;
int main( )
{
    char S[10]={'O', 'p', 'p', 'a', 'P', 'o', 'p', 'a', '\0'};
    int i;
    char p;
          for (i=9; i>=0; i--)
              printf("%c ", S[i]);
              _getch();
    return 0;
}
Если, конечно, нужно просто его вывести.

А так, да, инициализация i плюс неверное условие в цикле вывода.

Код:
#include <iostream>
#include <string>
#include <conio.h>
using namespace std;
int main( )
{
    char S[10]={'O', 'p', 'p', 'a', 'P', 'o', 'p', 'a', '\0'};
    int i = 0;
    char p;
    while (i<10/2)
    {
          p=S[i];
          S[i]=S[9-i];
          S[9-i]=p;
          i++;
          }
          i=0;
          for (i=0; i<10; i++)
          {
              printf("%c ", S[i]);
              }
              printf("%s ", S);
          _getch();
    return 0;
}
Никто

мой блог

Последний раз редактировалось three_cats; 21.10.2012 в 16:48.
three_cats вне форума Ответить с цитированием
Старый 28.10.2012, 08:19   #4
Zaza7
 
Регистрация: 21.10.2012
Сообщений: 9
По умолчанию

Спасибо! Все получилось! Но не совмем понятно, почему это работает для числового массива, а для символьного нет.
Zaza7 вне форума Ответить с цитированием
Старый 28.10.2012, 11:19   #5
three_cats
Форумчанин
 
Аватар для three_cats
 
Регистрация: 27.09.2012
Сообщений: 175
По умолчанию

Здесь и есть символьный массив. И все работает.
Никто

мой блог
three_cats вне форума Ответить с цитированием
Старый 28.10.2012, 13:35   #6
KuPuJIJI
Пользователь
 
Аватар для KuPuJIJI
 
Регистрация: 15.10.2012
Сообщений: 11
По умолчанию

Вот код если я правильно понял тебя ток на языке С


#include <stdio.h>
#include <conio.h>
void main()
{
const int n=4;
int a[n];
puts("Vvedite element massiva:");
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
for(int i=n-1;i>=0;i--)
printf("%5d",a[i]);
getch();
}
проверял вроде работает
ICQ-632296180
KuPuJIJI вне форума Ответить с цитированием
Старый 28.10.2012, 17:18   #7
Zaza7
 
Регистрация: 21.10.2012
Сообщений: 9
По умолчанию

я имела в виду, то, что я написала работает для числового, а для символьного не работает
Zaza7 вне форума Ответить с цитированием
Старый 30.10.2012, 00:32   #8
Murashov
Форумчанин
 
Аватар для Murashov
 
Регистрация: 30.10.2012
Сообщений: 121
По умолчанию

for(int i=0, j=SIZE-1;i<SIZE;i++, j--) mas2[i]=mas[j];
не важно какой массив символьный или целочисленный, такой вариант должен работать

если без использования второго массива, то я бы сделал бы счётчик от нуля до SIZE/2 и от SIZE до SIZE/2 и менял бы местами элементы через сумму (a=a+b ; b=a-b ; a=a-b ; ). ну или в Вашем случае через temp (temp=mas[i]; mas[i]=mas[j]; mas[j]=temp; ) (хотя символьный массив тоже можно через сумму: суммировать номер символа по таблице.. экономичнее выйдет по памяти. номер символа берём printf("%d", 'f');например)

Последний раз редактировалось Murashov; 30.10.2012 в 00:43.
Murashov вне форума Ответить с цитированием
Старый 30.10.2012, 13:40   #9
Nuklon
Форумчанин
 
Аватар для Nuklon
 
Регистрация: 05.04.2012
Сообщений: 134
По умолчанию

Цитата:
Сообщение от Zaza7 Посмотреть сообщение
я имела в виду, то, что я написала работает для числового, а для символьного не работает
Zaza7, не надо мучить червячка, надо использовать шаблончики.
Код:
#include <iostream>
#include <algorithm>

template<typename T> void t_reverse(T* a, T* b) {
    T t;
    for(b -= 1; a < b; ++a, --b) {
        t  = *a;
       *a = *b;
       *b = t;
   }
}


int main(){
   char s[] = "123";
   puts(s);  // исходная строка
   t_reverse(s, s + strlen(s));
   puts(s);  // вывод реверс-строки
	
   double arr[] = { 10.99, 34.66, 3.14567, 1.7 };
   int size  = sizeof(arr)/sizeof(arr[0]);

   // выведем исходный массив
   std::copy(arr, arr + size, std::ostream_iterator<double>(std::cout, "\t"));
   t_reverse(arr, arr + size);
   std::cout << std::endl;
   // выведем реверс массив
   std::copy(arr, arr + size, std::ostream_iterator<double>(std::cout, "\t"));
   return 0;
}
Данный шаблон любой тип реверснёт.
Nuklon вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обработка символьного массива с пом. указателей magrif Помощь студентам 11 02.11.2011 18:14
Удаление элемента из символьного массива Mixim Visual C++ 4 03.12.2010 16:38
Перевернуть строку заданную интервалом Gongled Паскаль, Turbo Pascal, PascalABC.NET 0 08.05.2009 17:26
Перевернуть строку Манжосов Денис :) Общие вопросы Delphi 13 03.12.2008 04:37
Удвоить каждый символ строки, потом перевернуть строку Didi Помощь студентам 6 20.05.2008 15:33