#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/