#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void print_reverse(char *s)
{
    size_t len=strlen(s);
    char *t=s+len-1;
    printf("%s %s\n",t,s);
    while(t>=s){
        printf("%c",*t);
        t=t-1;
    }
    puts("");
}
int main(){
    print_reverse("Hello");

}


谁能说出char *t=s+len-1;while(t>=s)的工作原理。我无法理解如何将数字添加到指针以及如何在while循环中比较指针。该程序用于反转c中的字符串。

最佳答案

让我们逐行执行此操作:

print_reverse("Hello");
void print_reverse(char *s)


现在,s指向包含以下内容的字符串:

- - ----+----+----+----+----+----+----+---- - -
        |  H |  e |  l |  l |  o | \0 |
- - ----+----+----+----+----+----+----+---- - -
           ^
           s


最后一个字符称为字符串“ NUL”终止符,因为“ NUL”是ASCII值为零的字符的名称(所有不可打印的ASCII值都有三个字母名称)。

    size_t len=strlen(s);


现在len的值为5。请注意,它不包括“ NUL”终止符,因此即使字符串占用6个字节,长度也为5。

    char *t=s+len-1;


现在t的值为s + 4。如果计算内存位置,这是您得到的:

- - ----+----+----+----+----+----+----+---- - -
        |  H |  e |  l |  l |  o | \0 |
- - ----+----+----+----+----+----+----+---- - -
           ^                   ^
           s                   t


请注意,s+strlen(s)将指向“ NUL”终止符。

    printf("%s %s\n",t,s);


该printf应该打印Hello o

    while(t>=s)


while循环将一直持续到t>=s,这意味着它将为每个字符(包括s指向的字符)执行循环的正文。

        printf("%c",*t);


这将打印t指向的内存的内容。它以o开头,并向后向H继续。

        t=t-1;


向后移动t的部分。最终,t将超过s,然后循环将结束。循环完成后,它将如下所示:

- - ----+----+----+----+----+----+----+---- - -
        |  H |  e |  l |  l |  o | \0 |
- - ----+----+----+----+----+----+----+---- - -
      ^    ^
      t    s


最后是最后一行:

    puts("");


这将打印一个空字符串和最后一个换行符-字符串中没有换行符,但是我们需要一个换行符,因此这是一种实现方法。

关于c - 谁能告诉我这段代码是如何工作的?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54756704/

10-13 00:41