我正在编写一个代码来反转字符串:
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;
答案 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
,因此您可以修改值。