将字符串反转到位的问题

时间:2012-01-15 16:57:13

标签: c string

我正在编写一个代码来反转字符串:

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 个答案:

答案 0 :(得分:2)

你说你这样做:

ReverseInPlace("123456789");

你需要做这样的事情:

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

以后一种方式执行此操作可以分配您可以修改的存储,而不是修改文字字符串,这是非法的。

答案 1 :(得分:0)

我的建议

#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

答案 2 :(得分:0)

char *p="abcd123"; // ........字符串文字存储在只读内存中,主要位于text segment(存储代码的位置),所以你不应该在这里更改值,因为它可能会崩溃通过写入代码来实现您的程序。这里p指向可能在文本段中的地址。

char q[]="abcd1234"; // .....值可以更改,数组大小可以修改,但地址不能更改,因为数组只是一个常量指针。这是你的代码的问题.....你正在调用函数和参数是一个字符串文字,而它应该是一个常量指针。此外,此处的存储类为stack,因此您可以修改值。