CodeSky 代码之空

随手记录自己的学习过程

C 编写函数实现函数字符串字符颠倒

2014-02-22 15:58分类: C评论: 0

这是K&R中的一道题目: 编写一个函数reverse(s),将字符串s中的字符顺序颠倒过来。使用该函数编写一个程序,每次颠倒一个输入行中的字符顺序。

在PHP中曾经做过类似的题,见PHP 实现中文字符串截取无乱码,同样也是写reverse()函数,我相信C中也有现成的函数,因为编译器高亮颜色不一样。

输出示例:

1hello
2olleh
3

源码:

1#include <stdio.h>
2
3#define MAXLINE 1000
4
5int getline(char line[], int maxline);
6void reverse(char s[]);
7
8main(void)
9{
10    char line[MAXLINE];
11
12    while (getline(line, MAXLINE) > 0) {
13        reverse(line);
14        printf("%s", line);
15    }
16    return 0;
17}
18
19int getline(char s[], int lim)
20{
21    int c, i, j;
22
23    j = 0;
24    for (i = 0; (c = getchar()) != EOF && c != '\n'; ++i)
25        if (i < lim -2) {
26            s[j] = c;
27            ++j;
28        }
29
30    if (c == '\n') {
31        s[j] = c;
32        ++i;
33        ++j;
34    }
35    s[j] = '\0';
36    return i;
37}
38
39void reverse(char s[])
40{
41    int i, j;
42    char temp;
43
44    i = 0;
45    while (s[i] != '\0')
46        ++i;
47    --i;
48    if (s[i] == '\n')
49        --i;
50    j = 0;
51    while (j < i) {
52        temp = s[j];
53        s[j] = s[i];
54        s[i] = temp;
55        --i;
56        ++j;
57    }
58}
59

其中getline()在这一小章很常用,可是我不知道他的line变量为什么能够顺利输出,明明是局部变量才对?等看了正式的一章一章应该就明白。

reverse()函数比较容易理解:

1void reverse(char s[])
2{
3    int i, j;
4    char temp;
5
6    i = 0;
7    while (s[i] != '\0')
8        ++i;
9    --i;
10    if (s[i] == '\n')
11        --i;
12    j = 0;
13    while (j < i) {
14        temp = s[j];
15        s[j] = s[i];
16        s[i] = temp;
17        --i;
18        ++j;
19    }
20}
21

j递增i递减,有点像相遇问题,两边不断交换就反转了。

评论 (0)