我看到一个非常有趣的代码来反转字符串, 但我不明白这里:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
void Reverse(char *s);
int main()
{
char *s=NULL;
s=(char *)malloc(sizeof(char *));
gets(s);
Reverse(s);
puts(s);
return 0;
}
void Reverse(char *s)
{
char *end=s;
char tmp;
if (s)
{
while (*end)
{
++end;
}
--end;
while (s<end) ??
{
tmp=*s;
*s++=*end;
*end--=tmp;
}
}
}
我看到这个程序尝试使用end = s来同时更改两个字符串,但是'*'行:while(s<end)
在这里是什么意思?
我使用gdb并发现当我们输入asdfgh
时,* s是fdsa而* end是fds,这不再是真的,这条线如何控制程序?
我只是想知道'??'线平均.. ..
非常感谢!
答案 0 :(得分:2)
C中的字符串由\0
字符终止,该字符具有整数值0
。因此,这是一个错误的价值。
使用while(*end)
检查end
是否指向给定字符串的终止字符。如果它没有指向末尾,则进一步移动它(++end
)。为确保指针有效,请在此之后向后移动“光标”。
while(s < end)
现在将检查s
是否进一步转发而不是end
。如果没有,那么你将交换两个“光标”的值。 end
将向s
移动,反之亦然。这样你就可以反转字符串了。
您正在调试输出是gdbs解释的结果。它将end
作为字符串进行了对等,而不是单个字符。调试时请查看*end
。
请注意,您的malloc
完全错误。您必须为字符串分配足够的内存,例如s = malloc(500*sizeof(char));
。请改用fgets
,您可以在其中指定要读取的最大字符数。不要忘记释放你分配的所有内存:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define BUFFER_SIZE 500
void Reverse(char *s);
int main()
{
char* s = malloc(BUFFER_SIZE * sizeof(char));
fgets(s,BUFFER_SIZE,stdin);
Reverse(s);
puts(s);
free(s);
return 0;
}
void Reverse(char *s)
{
char* end=s;
char tmp;
if(s)
{
while (*end)
{
++end;
}
--end;
while (s<end)
{
tmp=*s;
*s++=*end;
*end--=tmp;
}
}
}
答案 1 :(得分:0)
s和end是char指针,因此测试(s&lt; end)为真,直到s指针不会变得大于结束指针为止。
假设您要反转存储在地址0x0000处的字符串“hello”,并且是您所拥有的函数的开头:
s = 0x0000 结束= 0x003
现在是while循环: