Online Compiler C

#include <stdio.h> #include <string.h> int main() { FILE *fin = fopen("input.txt", "r"); FILE *fout = fopen("output.txt", "w"); char s[1005]; fgets(s, 1000, fin); int len = strlen(s); // 先把所有非空格字符存到临时数组 char temp[1005]; int cnt = 0; for (int i = 0; i < len; i++) { if (s[i] != ' ') { temp[cnt++] = s[i]; } } // 两两交换临时数组里的字符 for (int i = 0; i < cnt - 1; i += 2) { char t = temp[i]; temp[i] = temp[i + 1]; temp[i + 1] = t; } // 把交换后的字符回填原字符串,空格位置不变 int p = 0; for (int i = 0; i < len; i++) { if (s[i] != ' ') { s[i] = temp[p++]; } } fprintf(fout, "%s", s); fclose(fin); fclose(fout); return 0; }
这段代码的功能是:从 input.txt 读取一行字符串,将其中所有非空格字符两两交换(相邻的一对交换位置),然后保持空格位置不变,将结果写入 output.txt。

代码的思路是:先把所有非空格字符提取到临时数组,在临时数组里进行两两交换,最后再按原字符串中空格的位置,把交换后的字符填回去。

需要注意的一个地方是:代码中 fgets 读取时指定了最多读 1000 个字符,但字符串数组大小是 1005,这没问题。不过 fgets 会读取换行符并存入字符串,这可能导致末尾多一个换行符,而换行符不是空格,会被当作普通字符参与交换,可能不是你期望的行为。

- 检查一下 fgets 读入的字符串末尾是否包含换行符,以及这个换行符是否应该被当作普通字符处理。
- 另外,如果字符串长度为奇数,最后一个非空格字符会保持不动,这是你预期的吗?