首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Head First C string.h .h相关问题

Head First C string.h .h相关问题
EN

Stack Overflow用户
提问于 2017-06-05 21:00:26
回答 2查看 96关注 0票数 0
代码语言:javascript
运行
复制
#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;)。有人能解释一下这是英语口语吗?

EN

回答 2

Stack Overflow用户

发布于 2017-06-05 21:19:47

对于初学者,此函数

代码语言:javascript
运行
复制
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("");
}

是错误的并且具有未定义的行为。:)

有两个问题。

第一个是作为参数传递的字符串长度可以为零。在本例中,此声明

代码语言:javascript
运行
复制
char *t = s + len - 1;

将看起来像

代码语言:javascript
运行
复制
char *t = s - 1;

并且指针t可能是错误的。

第二个问题是这个表达式语句

代码语言:javascript
运行
复制
t = t - 1;

在指针t等于s的情况下具有未定义的行为。

来自C标准(6.5.6加法运算符)

  1. ...If指针操作数和结果都指向同一数组对象的元素,或者指向数组对象的最后一个元素之后的元素,则计算不会产生溢出;否则,行为为溢出

正确的函数实现可能如下所示

代码语言:javascript
运行
复制
void print_reverse( const char *s)
                    ^^^^^
{
    size_t len = strlen(s);
    const char *t = s + len;
                    ^^^^^^^
    while (t != s)
           ^^^^^^
    {
        printf("%c", *--t);
                     ^^^^
    }
    puts("");
}

至于你的问题,在这份声明中

代码语言:javascript
运行
复制
char *t = s + len - 1;

指针t尝试由在终止零之前的字符串的最后一个字符的地址来初始化。

票数 7
EN

Stack Overflow用户

发布于 2017-06-05 21:06:07

此函数背后的主要逻辑是此代码:

代码语言:javascript
运行
复制
char *t = s+ len-1;

返回一个指针,指向要传递给函数的字符指针中最后一个字符的地址。循环通过递减它来打印它:

代码语言:javascript
运行
复制
t = t - 1;

简单地说,它从后向打印char指针。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44369551

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档