// 颠倒字符串中的字符顺序 #include <stdio.h> #define MAXLINE 1000 // maximum input line length int getline(char s[], int lim); void reverse(char s[]); void swap(char *a, char *b); int main() { int len; // current line length char line[MAXLINE]; // current input line while ((len = getline(line, MAXLINE)) > 0) { // 只处理未超出最大长度的行,因为超出了line中存不下,若超出的话, // 则只会颠倒了存放在line中的字符(以下没有这样做), // (可以不用判断,直接处理) if (len <= MAXLINE) { reverse(line); printf("after reverse, line: %s", line); } } return 0; } // getline: read a line into s (include '/n' and '/0'), return length int getline(char s[], int lim) { int c, i, j; // 调用的时候实参是设定的最大长度,所以下面操作不会出现越界。 // 此处是lim-2是因为还要存放最后一个'/n'和一个'/0'。 // 此处j记录的是复制的字符个数,i只是记录了文本行的真实长度, // 但是要存放超出MAXLINE的字符还要多分配空间才可以,否则会越界 j = 0; for (i = 0; (c = getchar()) != EOF && c != '/n'; ++i) { if (i < lim -2) { s[j] = c; ++j; } } if (c == '/n') { s[j] = c; ++j; ++i; } s[j] = '/0'; return i; } // reverse: 将字符串s中的字符颠倒过来 void reverse(char s[]) { int i, j; i = 0; while (s[i] != '/0') // 到达字符串尾 { ++i; } --i; // 回退一个字符,当前i指向'/0'的前一个字符 if (s[i] == '/n') // 刚好存放了一行 { --i; // 回退一个字符,当前i指向'/n'的前一个字符 } for (j = 0; j < i; --i, ++j) { swap(&s[i], &s[j]); } } // swap: 交换两个字符 void swap(char *a, char *b) { char c; c = *a; *a = *b; *b = c; }