C中的字符串反转

时间:2013-10-12 09:21:52

标签: c string reverse

我有用于反转字符串的代码。假设我键入'ABC',输出将为'CBA'。但是,有些代码行我完全不明白。

1    #include <stdio.h>
2    #include <string.h>
3
4    void print_reverse(char *s) {
5   size_t len = strlen(s);
6
7   char *t = s + len-1;
8   while(t >= s) {
9       printf("%c", *t);
10      t = t-1;
11  }
12  puts("");
13  }
14
15    int main()
16    {
17  char charinput[100];
18  printf("Enter character you want to reverse:");
19  fgets(charinput, 100, stdin);
20  print_reverse(charinput);
21  getchar();
22    }

第7行和第8行有什么作用?指针t的输出是什么?

6 个答案:

答案 0 :(得分:8)

发布的代码使用以下算法:

  • 第7行:将指针t设置为字符串中的最后一个字符(注意:如果用户输入的字符串少于99个字符,则它将是换行符)。 -1是从终止的nil-char
  • 移回一个字符
  • 8-10行:这是逆转报告循环的核心。指针t针对字符串开头的地址重复测试。条件子句检查t值(地址)是否大于或等于字符串的起始地址。只要是这样,就会输入循环体,当前位于t中的地址的角色将通过printf()发送到标准输出。然后t中的地址递减一个类型宽度(大多数所有系统上的单字节char一个字节)并且循环重复。只有当ts之前包含地址时才会发生循环中断(并注意:这不在标准范围内;请参阅下面的原因)。

你应该知道关于这个循环的东西(如果不是你,应该指出作者)。最终的指针比较不符合标准。该标准指定非null,like-type之间的比较,指针在有效序列的基址(此代码中为charinput,通过s参数化的地址)中有效,直至并包括一种类型-element 过去分配的内存区域。此代码将ts进行比较,仅在t为“较少”时才打破循环。但是,只要t小于s,其价值就不再与s在法律范围内具有可比性。根据标准,这是因为t不再包含有效地址,该地址落在charinput到{ - {1}}内存块大小的范围内。

正确执行此操作的一种方法如下:

<击>

<击>
charinput

<击>

修改:在从Paul Hankin刺激之后进入标准之后,之前的代码已经被重写以解释未被注意的UB条件。更新后的代码记录如下:

t = s + len;
while (t-- > s)
    printf("%c", *t);

这也适用于零长度字符串。它的工作原理如下:

  • t = s + len; while (t != s) printf("%c", *--t); 设置为字符串的终止nulchar的地址。
  • 输入循环,只要t中的地址不等于t的基地址,条件就会继续。
    • 减少s,然后取消引用结果地址以获取当前字符,并将结果发送到t
    • 循环以进行下一次迭代。

答案 1 :(得分:3)

让我们一步一步地理解它:

  1. len = strlen(s)会将指向 bytes 的字符串s的大小指定给len(比如说​​len为10) 。

  2. s指向字符串的第一个字符。假设此字符串的第一个元素的地址为100,则s包含100

  3. len-1添加到s将会109
  4. 现在,第7行

       char *t = s + len-1;
    

    告诉编译器t指向地址109处的元素,即字符串的最后一个元素。

    第8行

       while(t >= s) {
    

    告诉编译器循环将继续,直到t指向之前字符串的第一个元素。

答案 2 :(得分:1)

第7行:指针t指向最后一个字符(s+len-1) 第8行:当t的地址等于或大于s的地址时重复该步骤。假设s指向第一个输入字符串的地址是1101,则下一个字符的地址是1101 + 1 = 1102,第三个是1102 + 1 = 1103,依此类推。如果输入的长度为10个字符,那么第7行中的1101 + len-1将为1101+10-1 (1110) 第9行:按t指向的地址打印字符。 第10行:t递减1,现在指向左边的字符 当地址大于或等于(在我的插图中为1110)时重复9和10

答案 3 :(得分:0)

t开始指向字符串s的最后一个字符,并且在随后的循环中减少,直到它指向第一个字符。对于每个循环迭代,都会打印字符。

答案 4 :(得分:0)

第7行将指针t设置为指向字符串s的结尾。第8行是一个while循环(它将向后遍历字符串,直到开头)。指针t是字符串中的当前位置,并在第9行输出。

答案 5 :(得分:0)

char *t = s + len-1;:指向字符串s的最后一个字符 while(t >= s):以相反的顺序扫描字符串s的所有字符(s指向第一个字符,并且t指向line 7中的最后一个字符。< / p>

希望这有帮助。