#include <stdio.h>
#include <string.h>
void print_reverse(char *s)
{
size_t len = strlen(s);
char *t = s + len - 1;
while (t >= s)
{
printf("%c", *t);
t = t - 1;
}
puts("");
}
上面的函数将在屏幕上向后显示一个字符串。但是我不理解第7行(char *t = s+ len-1;)。有人能解释一下这是英语口语吗?
发布于 2017-06-05 21:19:47
对于初学者,此函数
void print_reverse(char *s)
{
size_t len = strlen(s);
char *t = s + len - 1;
while (t >= s)
{
printf("%c", *t);
t = t - 1;
}
puts("");
}
是错误的并且具有未定义的行为。:)
有两个问题。
第一个是作为参数传递的字符串长度可以为零。在本例中,此声明
char *t = s + len - 1;
将看起来像
char *t = s - 1;
并且指针t
可能是错误的。
第二个问题是这个表达式语句
t = t - 1;
在指针t
等于s
的情况下具有未定义的行为。
来自C标准(6.5.6加法运算符)
正确的函数实现可能如下所示
void print_reverse( const char *s)
^^^^^
{
size_t len = strlen(s);
const char *t = s + len;
^^^^^^^
while (t != s)
^^^^^^
{
printf("%c", *--t);
^^^^
}
puts("");
}
至于你的问题,在这份声明中
char *t = s + len - 1;
指针t
尝试由在终止零之前的字符串的最后一个字符的地址来初始化。
发布于 2017-06-05 21:06:07
此函数背后的主要逻辑是此代码:
char *t = s+ len-1;
返回一个指针,指向要传递给函数的字符指针中最后一个字符的地址。循环通过递减它来打印它:
t = t - 1;
简单地说,它从后向打印char指针。
https://stackoverflow.com/questions/44369551
复制相似问题