N-36 David不想整理文本
稍微有些复杂,写了一些时间,然后乐学编译器还有一点离谱...
题目描述:
David对网络中的各种乱七八糟的文本感到很厌恶,想让你写一个程序来完成这个任务。你的程序需要完成以下要求:
1.每一句话首字母大写,其余字母小写(默认以’.’分割每一句话);
2.清除多余的空格:
每一个单词最后要有一个空格;
如果单词后有标点的,只在标点后有一个空格(标点只有’,’’.’);
第一个单词前和最后一个标点后不留空格)。
我们认为出了大小写不匹配、空格多余之外David的同学不会犯其他错误。
注意:可以用strlen函数获取字符串长度,如strlen(str),但要在开头处添加#include <string.h>;使用gets(str)可以以回车为分界读入字符串。
样例输入:Bob has never had a friend , so alice decide to help him, No matter how hard it is tO do sO. yesterday , alice Met a goOd friend, tom. Tom was oNe of her frienDs , But he knows littLE aBout bob. Instead, eRic is a good choice.
样例输出:Bob has never had a friend, so alice decide to help him, no matter how hard it is to do so. Yesterday, alice met a good friend, tom. Tom was one of her friends, but he knows little about bob. Instead, eric is a good choice.
思路:用逗号和句号划分字符串,找出逗号,句号后面第一个非空格字符,中间补上一个空格,大写字母只会在句号后或者开始出现,我们可以将其打上标记,在输出字符串中处理,然后处理空格字符。
代码:
#include <stdio.h>
#include <string.h>
int main () {
char a [1000] = {0}, b [1000] = {0}; //记得要初始化,乐学不初始化会报错
int ok [1000] = {0}; // 大写标记数组
ok [0] = 1; // 第一位大写
gets (a);
int j=-1; // 初始化为-1,++j就可以从0开始
int n = strlen (a);
for (int i = 0; i < n; i ++) {
if (a [i] >= 'a' && a [i] <= 'z' || a [i] >= 'A' && a [i] <= 'Z') b[++j] = a [i]; // 字母直接读入
if (i == 0 && a [i] == ' ') { // 开头有空格的情况处理
while (a [i] == ' ') i++; // 因为开头是空格,这里就不需要do while
b [++j] = a [i]; // 读入首字母
}
if (a [i] == '.' ) { // 对句号进行处理
b [++j] = a [i]; // 先读入句号
if (a [i + 1] != '\0') { // 最后一个句号不用处理
do {i++;} while (a [i] == ' ');
b [++j] = ' '; // 读入一个空格
b [++j] = a [i]; // 读入第一个不为空格的字符
ok [j] = 1; // 打上大写标记
}}
if (a [i] == ',' ) { // 对逗号进行处理
b [++j] = a [i]; // 先读入逗号
do {i++;} while (a [i] == ' '); // 因为现在的a [i] 是逗号,所以要do while
b [++j] = ' '; //随便读入一个空格
b [++j] = a [i]; // 读入第一个不为空格的字符
}
if (a [i] == ' ' && (a [i + 1] >= 'a' && a [i + 1] <= 'z' || a [i + 1] >= 'A' && a [i + 1] <= 'Z')) b[++j] = ' '; // 读入单词之间的空格
}
for (int k = 0; k <= j ; k++) {
if (b [k] >= 'a' && b [k] <= 'z' && ok [k]) b [k] += 'A' -'a'; // 处理被大写标记的小写字母
if (b [k] >= 'A' && b [k] <= 'Z' && !ok [k]) b [k] += 'a' -'A'; // 处理没有被大写标记的大写字母
}
for (int k = 0; k <= j ; k++) printf("%c", b [k]);
printf("\n"); // puts也可
return 0;
}