// 删除行末的空格及制表符,并删除全是空格的行 #include <stdio.h> #define MAXLINE 1000 // maximum input line length int getline(char line[], int maxline); int remove(char s[]); // Print the largest input line int main() { int len; // current line length int length; // remove returns length char line[MAXLINE]; // current input line while ((len = getline(line, MAXLINE)) > 0) { printf("length: %d, line: %s", len, line); if ((length = remove(line)) > 0) { printf("after remove, length: %d, line: %s", length, 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; } // remove: 从字符串s中去掉结尾的空格符及制表符,并返回处理后的字符串长度 int remove(char s[]) { int i; i = 0; while (s[i] != '/n') // 到达行末 { ++i; } --i; // 回退一个字符,当前i指向'/n'的前一个字符 while (i >= 0 && s[i] == ' ' || s[i] == '/t') { --i; } if (i >= 0) // 至少含有一个字符 { ++i; s[i] = '/n'; // 重新组织为一个新行 ++i; s[i] = '/0'; // 结束存储的字符串 } --i; // 字符串长度不包括最后一个'/0' return i; }