Head First C string.h相关问题

时间:2017-06-05 13:00:26

标签: c string function pointers reverse

#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;)。有人可以解释这是英语口语吗?

2 个答案:

答案 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添加剂操作员)

  
      
  1. ...如果指针操作数和结果都指向相同的元素   数组对象,或者超过数组最后一个元素的对象   对象,评估不得产生溢出; 否则,   行为未定义
  2.   

正确的函数实现可以采用以下方式

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指针。