我有用于反转字符串的代码。假设我键入'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的输出是什么?
答案 0 :(得分:8)
发布的代码使用以下算法:
t
设置为字符串中的最后一个字符(注意:如果用户输入的字符串少于99个字符,则它将是换行符)。 -1
是从终止的nil-char t
针对字符串开头的地址重复测试。条件子句检查t
值(地址)是否大于或等于字符串的起始地址。只要是这样,就会输入循环体,当前位于t
中的地址的角色将通过printf()
发送到标准输出。然后t
中的地址递减一个类型宽度(大多数所有系统上的单字节char
一个字节)并且循环重复。只有当t
在 s
之前包含地址时才会发生循环中断(并注意:这不在标准范围内;请参阅下面的原因)。你应该知道关于这个循环的东西(如果不是你,应该指出作者)。最终的指针比较不符合标准。该标准指定非null,like-type之间的比较,指针在有效序列的基址(此代码中为charinput
,通过s
参数化的地址)中有效,直至并包括一种类型-element 过去分配的内存区域。此代码将t
与s
进行比较,仅在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)
让我们一步一步地理解它:
len = strlen(s)
会将指向 bytes 的字符串s
的大小指定给len
(比如说len
为10) 。
s
指向字符串的第一个字符。假设此字符串的第一个元素的地址为100
,则s
包含100
。
len-1
添加到s
将会109
。 现在,第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>
希望这有帮助。