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

// 删除文本中多余的空格,单词之间只保留一个空格,文本以'.'结尾(输出不包含'.') #include <stdio.h> int main() { char ch;//输入字符char int last_was_space =1;//上一个输出字符为空格:last_was_space =0 //上一个输出字符不为空格:last_was_space =1 //初始设为 1,表示“上一个输出的是空格(开头的连续空格都会被忽略) while (1) // 无限循环,遇到 '.' 时跳出 { scanf("%c", &ch); // 逐个字符读入 // 放在循环内部,程序需要逐个字符地读取输入 if (ch == '.') //遇到.跳出循环 { break; } if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z')) //输入字符为大小写字母 { printf("%c", ch); // 直接输出字母 last_was_space = 0;//0 代表 “上一个输出的是字母”(不是空格) } else if (ch == ' ') //输入字符为空格 { if (last_was_space == 0) { printf(" ");//输出空格 last_was_space = 1; //1 代表 “上一个输出的是空格” } } } return 0; }
这段代码的功能是:从输入中逐个读取字符,遇到句号 '.' 时停止,并将文本中多余的空格压缩为单词之间只保留一个空格,最后输出处理后的文本(不包含句号)。

代码的逻辑基本正确,但有一个小问题需要注意。

- 你的 `last_was_space` 变量命名和赋值逻辑有些混乱。你注释中说 `last_was_space = 1` 表示“上一个输出的是空格”,但实际代码中,输出字母后你将其设为 0,输出空格后设为 1。这会导致逻辑判断时容易混淆。建议统一理解:变量名应该直观反映“上一个输出的字符是否为空格”,比如用 `1` 表示“是空格”,`0` 表示“不是空格”,然后检查条件时保持一致。

- 另外,初始值设为 1 是为了忽略开头的连续空格,这个思路是对的。但注意:如果输入的第一个字符就是字母,你的代码会正确输出;但如果输入的第一个字符是空格,由于 `last_was_space` 初始为 1,这些空格会被正确跳过。这一点没有问题。