Онлайн компилятор C

#include <stdio.h> int main() { char n[100]; scanf("%s", n); int i = 0; int found = 0; while (n[i] != '\0') { int max = n[i]; int record = i; for (int j = i; n[j] != '\0'; j++) { if (n[j] >= max) { max = n[j]; record = j; found = 1; } } if (found) { break; } else { i++; } } if (found) { int temp = n[i]; n[i] = n[record]; n[record] = temp; } printf("%s", n); return 0; }
这段代码试图在输入的字符串中找到第一个位置,使得该位置之后存在一个更大的字符,然后交换这两个字符。但逻辑上有几个问题。

- 你的外层循环变量 `i` 和内层找到的 `record` 在循环结束后可能指向不同的位置,但你在交换时使用了 `n[i]` 和 `n[record]`,而 `i` 此时已经因为 `break` 而停在某个位置,但 `record` 是内层循环最后一次更新的值,这个值可能并不是你想要交换的那个最大字符的位置。实际上,你的 `found` 变量在内层循环每次找到更大字符时都会置1,但内层循环结束后 `found` 为1,然后立即 `break`,此时 `record` 是最后一个满足 `n[j] >= max` 的字符位置,而不是整个字符串中最大字符的位置。

- 你的目的是找到第一个可以交换的位置,但内层循环每次从 `i` 开始扫描,如果 `n[i]` 本身已经是后面所有字符中最大的,那么 `found` 永远不会被置1,于是 `i++` 继续。但一旦遇到一个后面有更大字符的位置,`found` 置1并立即跳出外层循环,此时 `record` 是那个更大字符的位置。这个思路本身是可行的,但你的内层循环中 `if (n[j] >= max)` 使用了 `>=`,这会导致如果有多个相同最大字符,`record` 会指向最后一个,而不是第一个。如果你希望交换后得到尽可能大的结果,通常应该选择最靠右的最大字符,但这里需要明确你的目标。

- 另外,你的代码没有处理输入字符串可能包含空格的情况,`scanf("%s")` 会在空格处停止,但这不是主要问题。

提示:
- 检查内层循环中 `record` 的更新条件。当有多个相同最大字符时,你希望交换哪一个?这会影响最终结果。
- 思考一下,如果字符串已经是降序排列(例如 "dcba"),你的代码会输出什么?是否符合预期?