0

请您逐步向我解释这个 C 程序使用指针反转字符串的算法吗?

#include <stdio.h>

int main()

{
    char str[50];
    char rev[50];
    char *sptr = str;
    char *rptr = rev;

    int i=-1;
    printf("Enter any string : ");
    scanf("%s",str);

    while(*sptr)
    {
        sptr++;
        i++;
    }

    while(i>=0)
    {
        sptr--;
        *rptr = *sptr;
        rptr++;
        --i;
    }


    *rptr='\0';
    printf("Reverse of string is : %s",rev);
    return 0;
}
4

3 回答 3

6

魔术就在这个循环中:

while(i>=0) // while there are more letters... (i was previously set to the number of letters)
{
    sptr--;  // decrement source pointer (points to end of source string
    *rptr = *sptr; // copy char
    rptr++; // increment target pointer
    --i; // decrement number of chars remaining
}

实际上,相当直截了当。

于 2013-11-01T13:32:08.047 回答
2

这个循环

while(*sptr)
{
    sptr++;
    i++;
}

通过递增迭代字符串,sptr直到它到达字符串的零终止字符。循环后i会对应字符串的长度。然后在这个循环中:

while(i>=0)
{
    sptr--;
    *rptr = *sptr;
    rptr++;
    --i;
}

i有时我们复制 in 指向的字符之前的字符sptrrptr然后递减 sptr 使其指向前一个字符。

于 2013-11-01T13:30:46.217 回答
1

这个 while 循环计算大小。while当表达式的计算结果为 0 时终止。C 字符串由空终端终止,当转换为整数时为 0。所以这个循环一直持续下去,直到它检测到一个 C 字符串的结尾,这由 == 0 的空终止符的存在表示。 sptr 和我向下移动字符串,我计算字符数, sptr 被递增以指向下一个字符。最终sptr指向输入字符串的结尾。

 while(*sptr)
 {
     sptr++;
     i++;
 }

在下一个循环中,虽然我们还剩下字符(记住这个循环之前的 i 是字符串的大小),但我们sptr向后移动字符串(最后一个循环将它指向字符串的末尾)。与此同时,另一个rptr正在通过另一个字符串向前移动。该语句*rptr = *sptr从向后移动复制到向前移动sptr*rptr从而反转字符串。

while(i>=0)
{
    sptr--;
    *rptr = *sptr;
    rptr++;
    --i;
}
于 2013-11-01T13:31:27.250 回答