Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > reverse string добавляет в конце "1" - почему?


Автор: Killer_13 6.5.2009, 18:24
Нонсенс какой-то, вроде все правильно делаю, а вот ума не приложу почему так.
значит есть у меня строка, нужно перевернуть ее

например на входе
"061"
на выходе должно выдать
"160"
вместо этого выдает 161

Код

for(j=0,i=strlen(s1)-1; i>0; i--)
        {
        s1[j]=s1[i];
        j++;
        }
    return printf("\n\n\nS=%s",s1);    

Автор: azesmcar 6.5.2009, 18:33
Вместо
Цитата(Killer_13 @  6.5.2009,  18:24 Найти цитируемый пост)
s1[j]=s1[i];

надо
Код

char temp = s1[j];
s1[j] = s1[i];
s1[i] = temp;

Их надо менять местами а не присваивать

Добавлено через 4 минуты и 9 секунд
А вообще цикла до половины длины текста вполне достаточно
Код

int len = strlen(s1);
for(int i = 0; i < len / 2; ++i)
{
    char temp = s1[i];
    s1[i] = s1[len - i - 1];
    s1[len - i - 1] = temp;
}

а вообще
Код

std::reverse(s1, s1 + strlen(s1));

или еще лучше
Код

std::string r = "061";
std::reverse(r.begin(), r.end());

Автор: Killer_13 6.5.2009, 19:15
Хммм, может я опять че т не так делаю. :(

Язык "С"

Код

char s1[255],temp;
unsigned int i,j,lng;

....................................................


    for(j=0,i=strlen(s1)-1; i>0; i--)
        {
        temp = s1[i];
        s1[i] = s1[j];
        s1[j] = temp;
        j++;
        }
 

но этот код выдает еше большую беспорядицу. :(

Автор: azesmcar 6.5.2009, 19:17
Код

int main()
{
    char s1[255] = "061";
    char temp;
    unsigned int i, j;

    for(j=0,i=strlen(s1)-1; i>0; i--)
    {
        temp = s1[i];
        s1[i] = s1[j];
        s1[j] = temp;
        j++;
    }
    printf("%s\n", s1);
}

этот код не работает? smile 

Автор: Killer_13 6.5.2009, 19:36
Хммм, но факт остается фактом... :(
Код

#include <stdio.h>
int main()
{
    char s1[255] = "7023554";
    char temp;
    unsigned int i, j;
    for(j=0,i=strlen(s1)-1; i>0; i--)
    {
        temp = s1[i];
        s1[i] = s1[j];
        s1[j] = temp;
        j++;
    }
    printf("%s\n", s1);
}



выдаст
Код

4023557

Автор: azesmcar 6.5.2009, 19:40
Killer_13

Ну так алгоритм неправильный smile Я же привел рабочий вариант
Код

#include <stdio.h>
#include <string.h>
int main()
{
    char s1[255] = "7023554";
    char temp;
    unsigned int i;
    unsigned int len = strlen(s1);
    for(i = 0; i < len / 2; ++i)
    {
        temp = s1[i];
        s1[i] = s1[len - i - 1];
        s1[len - i - 1] = temp;
    }
    printf("%s\n", s1);
}

Killer_13

скажу больше..еще одна итерация - и вы вернете текст в первозданный вид smile 
как я сказал ранее

Цитата(azesmcar @  6.5.2009,  18:33 Найти цитируемый пост)
цикла до половины длины текста вполне достаточно


Автор: J0ker 6.5.2009, 20:03
Цитата(Killer_13 @  6.5.2009,  19:36 Найти цитируемый пост)
Хммм, но факт остается фактом... :(

естественно
вы переставляете символы два раза за исключением первого и последнего

Автор: stat007 6.5.2009, 20:16
самый оптимальный вариант:

Код

#include <iostream>
#include <string>
#include<algorithm>
using namespace std;
int main()
{
    string s;
    getline(cin, s);
    reverse(s.begin(), s.end());
    cout<<s<<endl;
    return 0;
}

Автор: Killer_13 6.5.2009, 20:19
stat007 
Эт "С" программирование

Автор: azesmcar 6.5.2009, 20:34
stat007

Оптимальным будет вот этот
Код

#include<iostream>
#include<string>
#include<algorithm>

using namespace std;

int main()
{
    string s;
    getline(cin, s);
    copy(s.rbegin(), s.rend(), ostream_iterator<char>(cout));
    return 0;
}

но человек написал что нужно на Си.

Добавлено через 23 секунды
Killer_13

Ну? не заработало? smile 

Автор: Killer_13 6.5.2009, 20:38
Заработало, спасибо. уже 6 часов из-зи компа не встаю, а оно как то мне не идет - эт программирование. :( 

Автор: Soah 6.5.2009, 20:38
Killer_13, так что же тебе надо, самому реализовать эту функцию, или использовать http://www.warpspeed.com.au/cgi-bin/inf2html.cmd?..%5Chtml%5Cbook%5CToolkt40%5CXPG4REF.INF+275 ?

Автор: Killer_13 6.5.2009, 20:45
вот я тупой, никогда внимательно не посмотрю. :(
пасиб, буду знать.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)