与这里的字符串比较是什么意思?

时间:2012-03-28 21:39:26

标签: c

我看到一个非常有趣的代码来反转字符串, 但我不明白这里:

#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,这不再是真的,这条线如何控制程序?

我只是想知道'??'线平均.. ..

非常感谢!

2 个答案:

答案 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循环:

  1. s = 0x0000 e = 0x0003 * s = o * e = h
  2. s = 0x0001 e = 0x0002 * s = l * e = e
  3. s = 0x0002 e = 0x0003&lt;&lt;退出&gt;&gt;