在屏幕上向后显示一个字符串

时间:2015-10-23 17:34:28

标签: c string

这是一本关于C头Head First的小函数。 此功能应在屏幕上向后显示一个字符串。

void print_reverse(char *s)
{
    size_t len = strlen(s);

    char *t = s + len - 1;
    while ( t >= s ) 
    {
         printf("%c", *t);
         t -- ;
    }
    puts("");
}

不幸的是,我不明白它是如何逆转的 串。

size_t len = strlen(s); //计算数量 字符串中的字符

char *t = s + len - 1; // 't'是指针 一个char类型 我不明白在这个等式中's'使用了什么值;我已经读过,当数组变量的名称被赋给指针时,它实际上是指地址 第一个字符,即数组[0];因此's' 这里的值为0,或者它是否具有整数值 一个特定的角色?

例如,单词是s [] =“hello”。那么如果s [0] ='h'。将strlen(s)添加到s[0]应该产生104(十进制),因此s + len - 1 = 104 + 6 - 1 = 109(-1因为我假设 我必须减去'\0'占用的strlen字符 考虑到)。但109是'm'。我看不出路 这个等式遍历字符串。

while (t >= s);我认为这意味着虽然 t不等于零,是否正确?

谢谢!

4 个答案:

答案 0 :(得分:2)

首先,s是指针,而不是普通的char变量。 因此,当您将字符串的内存地址分配给s时,它包含第一个位置的地址。

指针运算:通过向指针添加1,使其指向下一个存储位置。回想一下,字符串存储在连续的内存位置。

所以,如果s指向“你好”,

  • printf(*s)将打印'H'
  • printf(*(s+1))将打印“e”。

现在,我们在len中有长度(= 5)。当我们将len - 1添加到s时,我们会将其指向前方的5个位置。它现在指向'o'。

然后通过执行while(t >= s)我们比较两个指针(ts)并在t指向的地址处打印值并递减它,直到它变为等于s这是第一个元素。

插图:

初始条件:

H   e   l   l   o
*s              *t

现在我们打印*t并递减它。 输出:o

H   e   l   l   o
*s          *t 

我们继续进一步: 输出:lleH

H   e   l   l   o
*s
*t

从现在起t == s,我们停止了。

答案 1 :(得分:1)

void print_reverse(char *s)

此处s是指向字符串

开头的指针
    size_t len = strlen(s);

这等于字符串的字符数(\0未计算)

    char *t = s + len - 1;

此时,t是一个新指针,指向字符串的最后一个元素(如果您不清楚,请阅读有关指针算术的内容)

    while ( t >= s ) 
    {
         printf("%c", *t);
         t -- ;
    }

在此循环中t在每次迭代时递减,以便每次指向字符串中的前一个字符时。 在最后一次迭代中,t==s,这意味着您正在打印字符串的第一个元素。

答案 2 :(得分:0)

通过将指针t设置为字符串的最后一个字符然后执行以下操作来反转字符串:

  1. 打印t指向的字符。
  2. t减少一个(让它向左移动一个字符)
  3. 转到(1),除非t现在指向字符串的第一个字符之前。
  4. s是指向字符串第一个字符的指针。字符串只是内存中由NUL字符('\0')终止的字符序列。当t == st指向第一个字符时,t < st指向之前的第一个字节第一个字符,此字节为没有字符串的一部分。

    当循环终止时,t将不为零。 ts是指针,这意味着它们的值是内存地址。 s的值是字符串第一个字符的内存地址,该地址肯定不为零。

答案 3 :(得分:0)

s包含数组第一个字符的地址,而不是第一个字符本身。地址不是从数组开始的偏移量,而是任意(对用户)的值。因此,当您向len - 1添加s时,结果是指向索引len - 1处字符的指针。

换句话说,这个:

char *t = s + len - 1;

与此相同:

char *t = &s[len - 1];

只要while (t >= s)指向数组开始时或之后的内存位置,条件t的计算结果为真。