#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;)。有人可以解释这是英语口语吗?
答案 0 :(得分:7)
对于初学者这个功能
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
试图通过终止零之前字符串的最后一个字符的地址进行初始化。
答案 1 :(得分:2)
这个函数背后的主要逻辑是这段代码:
char *t = s+ len-1;
返回指向要传递给函数的char指针中最后一个char的地址的指针。循环通过递减来打印它:
t = t - 1;
所以简单来说就是从后面打印出char指针。