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;   
}



posted @ 2022-04-14 23:57  misasteria  阅读(84)  评论(0编辑  收藏  举报