C中的字符串反转
我有反转字符串的代码。假设我输入'ABC',输出将是'CBA'。然而,有一些代码行我不太明白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
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的有效地址
正确执行此操作的一种方法如下:
编辑:进入