C中的字符串反转

C中的字符串反转,c,string,reverse,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); 1

我有反转字符串的代码。假设我输入'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    }
1#包括
2#包括
3.
4无效打印(字符*s){
5尺寸长度=标准长度;
6.
7字符*t=s+len-1;
8 while(t>=s){
9 printf(“%c”,*t);
10t=t-1;
11  }
12认沽权(“”);
13  }
14
15 int main()
16    {
17 char charinput[100];
18 printf(“输入要反转的字符:”);
19个FGET(charinput,100个,标准尺寸);
20个反向打印(charinput);
21 getchar();
22    }

第7行和第8行是做什么的?指针t的输出是什么?

t开始指向字符串s的最后一个字符,在下面的循环中,指针t将减小,直到它指向第一个字符。对于每个循环迭代,都会打印字符。

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

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

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

char*t=s+len-1:指向字符串s的最后一个字符
while(t>=s)
:以相反顺序扫描字符串s的所有字符(因为
s
指向第一个字符,我们已使
t
指向
第7行中的最后一个字符)


希望这能有所帮助。

char*t=s+len-1:指向字符串s的最后一个字符
while(t>=s)
:以相反顺序扫描字符串s的所有字符(因为
s
指向第一个字符,我们已使
t
指向
第7行中的最后一个字符)


希望这有帮助。

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

  • len=strlen
    将以字节为单位为
    len
    指定字符串的大小(假设
    len
    为10)

  • s
    指向字符串的第一个字符。假设这个字符串的第一个元素的地址是
    100
    ,那么
    s
    包含
    100

  • len-1
    添加到
    s
    将得到
    109
    现在是7号线

       char *t = s + len-1;
    
    告诉编译器
    t
    指向地址
    109
    处的元素,即字符串的最后一个元素

    第8行

       while(t >= s) {
    

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

    让我们逐步了解它:

  • len=strlen
    将以字节为单位为
    len
    指定字符串的大小(假设
    len
    为10)

  • s
    指向字符串的第一个字符。假设这个字符串的第一个元素的地址是
    100
    ,那么
    s
    包含
    100

  • len-1
    添加到
    s
    将得到
    109
    现在是7号线

       char *t = s + len-1;
    
    告诉编译器
    t
    指向地址
    109
    处的元素,即字符串的最后一个元素

    第8行

       while(t >= s) {
    

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

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

    • 第7行:将指针
      t
      设置为字符串中的最后一个字符(注意:如果用户输入的字符串少于99个字符,则它将是换行符)。
      -1
      将从终止的nil字符向后移动一个字符
    • 第8-10行:这是反转报告循环的核心。指针
      t
      根据字符串开头的地址重复测试。condition子句检查
      t
      值(地址)是否大于或等于字符串的起始地址。只要是,就输入循环体,当前驻留在
      t
      中的地址的字符通过
      printf()
      发送到stdout。然后,将
      t
      中的地址递减一个类型宽度(在大多数具有单个字节
      char
      的系统中为一个字节),循环重复。只有当
      t
      包含
      s
      之前的地址时,循环才会中断(注意:这不在标准范围内;原因见下文)
    关于这个循环,你应该知道一些事情(如果不是你,应该向作者指出)。最终指针比较不符合标准。该标准规定了非空指针(如类型)之间的比较,指针从有效序列的基址(
    charinput
    在此代码中,通过
    s
    参数化的地址)开始有效,直到并包括一个类型元素通过分配的内存区域。此代码将
    t
    s
    进行比较,仅当
    t
    为“较少”时才中断循环。但只要
    t
    小于-s,其值就不再是与
    s
    可比的法律范围。根据标准,这是因为
    t
    不再包含介于
    charinput
    到超过
    charinput
    内存块大小1的有效地址

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

    编辑:进入