我有一个单词,如word1。
我该怎么办?
您要复制
Source Destin.
position position
-------- --------
0 --> 13
1 --> 12
2 --> 11
⋮
11 --> 2
12 --> 1
13 --> 0
是什么关系?好吧,目标位置是13减去源位置。
13是什么?好吧,它比字符串的长度小1。
因此,
length
中字符串的长度(w1
。i
到0
的每个索引(length-1
),i
的元素w1
。char
存储到length-i-1
的元素w2
中。length
的元素w2
中。最简单的解决方案是从w1
的末尾扫描并将字符复制到w2
,然后最后在\0
的末尾添加空字符w2
:
void rev(char *w1, char *w2) {
int len = strlen(w1);
for(int i = 0,k=len-1 ; i < len; i++,k--) {
w2[i] = w1[k];
}
w2[len] = '\0';
}
完整的测试代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void rev(char *w1, char *w2) {
int len = strlen(w1);
for(int i = 0,k=len-1 ; i < len; i++,k--) {
w2[i] = w1[k];
}
w2[len] = '\0';
}
int main()
{
char *word1 = "Im a guitarist";
char word2[30];
rev(word1, word2);
puts(word2);
return 0;
}
输出:
tsiratiug a mI
实际上,该功能不会颠倒句子。它以相反的顺序将一个句子复制到一个字符数组。
最好命名这样的函数,例如reverse_copy
。该函数应返回指向反向字符串的指针。
该功能可以通过不同的方式实现。这里显示了其可能的定义之一。
#include <stdio.h>
#include <string.h>
char * reverse_copy( char *s1, const char *s2 )
{
size_t n = strlen( s2 );
s1[n] = '\0';
for ( char *p = s1; n--; ++p )
{
*p = s2[n];
}
return s1;
}
int main(void)
{
char *word1 = "Im a guitarist";
char word2[30];
puts( reverse_copy( word2, word1 ) );
return 0;
}
程序输出为
tsiratiug a mI
或者例如,可以使用较少的局部变量来编写函数代码
char * reverse_copy( char *s1, const char *s2 )
{
size_t n = strlen( s2 );
s1[n] = '\0';
while ( n-- )
{
s1[n] = *s2++;
}
return s1;
}
在体内,该函数仅声明了一个局部变量n
。