Проблемы с изменением строки на месте - PullRequest
0 голосов
/ 15 января 2012

Я пишу код, чтобы перевернуть строку на месте:

void ReverseInPlace(char * x)
{
    char * end = x;
    int i;
    i = 0;
    char temp;
    while(*end)
    {
        ++end;//point tol end 
        ++i;//count the lenght
    }
    --end;
    printf("%s",end);

    printf("%d",i);
    while(i)
    {
        temp = *end;
        printf("%s","\n");
        printf("%c",temp);

        end--;
        x++;
        i--;
    }
    printf("%s","\n");//blank line
    printf("%s","\n");//blank line
    printf("%s","-----");//blank line
    printf("%s",x);//print original 
}

Вот мои заблуждения:
Даже если я могу печатать символы в обратном порядке, я хочу перевернуть строкубез использования массива

Я получаю сообщение об ошибке при попытке сделать следующее:

*x = temp;

Ответы [ 3 ]

2 голосов
/ 15 января 2012

Вы говорите, что делаете это:

ReverseInPlace("123456789");

Вам нужно сделать что-то вроде этого:

char str[] = "123456789";
ReverseInPlace(str);

При последнем способе выделяется память, которую вы можете изменить, а не модифицировать буквенную строку, что недопустимо.

0 голосов
/ 04 июня 2013

char *p="abcd123"; // ........ строковый литерал, хранящийся в постоянной памяти, в основном в text segment (где хранится код), поэтому вам никогда не следует менять здесь значение, так как это может привести к сбою вашей программы при записина код.Здесь p указывает на адрес, который может быть в текстовом сегменте.

char q[]="abcd1234"; // ..... значения могут быть изменены и размер массива может быть изменен, но адрес не может быть изменен, потому что массив является не чем иным, как постоянным указателем.Это проблема вашего кода ..... вы вызываете функцию, а параметр является строковым литералом, тогда как он должен быть постоянным указателем.Кроме того, класс хранения здесь stack, поэтому вы можете изменять значения.

0 голосов
/ 15 января 2012

Мое предложение

#include <stdio.h> // printf
#include <string.h> // strlen

void swap(char* a , char* b)
{
    char tmp;
    tmp=*a;
    (*a) = (*b);
    (*b) = tmp;
}

void ReverseInPlace(char * x)
{
    char * end = x;
    int i,j,length;
    char temp;

    length = strlen(x);

    //swap 1st with last, then 2nd with last-1, etc.  Till we reach the middle of the string.
    for(i=0,j=length-1 ; i<j ; ++i,--j)
        swap( &x[i] , &x[j]);
}

main (){
    char str[] = "123456789";
    ReverseInPlace(str);
    //ReverseInPlace("1234"); // this would lead to error, because "1234", can not be modified
    printf("%s\n",str);
}

После достижения середины вы должны поменять местами элементы, которые уже были заменены предыдущими итерациями.Для иллюстрации:

char* x = "1234";
1 2 3 4
4 2 3 1
4 3 2 1 // already reversed!
4 2 3 1
1 2 3 4 // if we continue till i==length-1 && j=0 , then we just get where we started
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...