果然,不出所料,有关某个知识点的应用部分的题目肯定要比其基础部分的题目要难上太多,就像练习15相比于练习14一样。实现题目本身不需要超纲的知识,就是方法上比较难想到。基本上每道题都很有挑战性,个人认为这其中最难想的是关于空格的处理上:增加空格,删去空格,以及删去多余的空格。关于字符的处理的题也很多,只不过没有处理字符的题目难:将大写字符变成小写字符,删除字符等。在这些题目中,最让我费解的是G题(驼峰命名法),最难的是I题(过滤文章中空格)。下面就让我讲讲从这两道题中体会到的感悟:
G(驼峰命名法)
题目描述:熟悉Java的同学都知道,Java中的对象名、类名、注解名或者配置文件中的名字等等大部分都以“驼峰命名法”规范命名。例如,如果有一个对象希望叫做“my first student”,那么按照驼峰命名法,就应该是"MyFirstStudent",也就是说,把每一个单词的首字母变成大写(如果已经是大写则不用变动),然后把所有单词拼接在一起,形成一个英文字符串S。现在给你一个按照驼峰命名法命名的字符串,需要你转换成原来的名字,即单词之间用一个空格分开,并且把每个单词的首字母变成小写。 
输入描述:共一行,输入一个字符串S(S是驼峰命名法命名的字符串) 1 <= S的长度 <= 1000 
输出描述:输出一行,为字符串S分解后的单词 单词之间用一个空格分开,并且把每个单词的首字母变成小写
这道题我刚开始对如何添加空格久久不能想出解决方案,但后来在受到曾经一道题的启发后,我想到了一个解决方法:只需要将大写字母转换成小写字母,之后如果原来的大写字母不是第一个字符,并且大写字母的前一个字符不是空格,就打印一个空格,之后输出字符数组即可。
代码如下:
#include <stdio.h>
#include <string.h>
int main() 
{
    char s[1001];
    gets(s);
    int i,l=strlen(s);
    for (i=0;i<l;i++) 
    {
        if (s[i]>='A'&&s[i]<='Z') 
        { 
            s[i]+=32; 
            if (i!=0&&s[i-1]!=' ')//如果原来的大写字母不是第一个字符,并且大写字母的前一个字符不是空格,就打印一个空格         { 
            printf(" "); 
            }
        }
        printf("%c",s[i]); 
    }
    return 0;
}

I题(过滤文章中空格)
题目描述:过滤多余的空格。一篇文章中也许有多个连续空格,过滤掉多余的空格,只留下一个空格。
输入描述:一行,一个字符串(长度不超过1000)
输出描述:过滤之后的文章。
这道题,我当时做的时候,非常的茫然,不知道如何才能精准删除多余的空格而只保留一个空格。后来,在经过一番深思熟虑之后,想到了一个可行的办法:先判断字符数组(或字符串)中某个字符是否是空格字符,如果是进入循环判断是否下一个字符也是空格,计数器n从第一个空格开始自增1,如果计数器n的值大于1,说明存在至少两个连续的空格,则进入另一个循环删除n-1个空格(因为要留下一个空格),并且通过循环移动非空格字符以填补因删除连续空格而产生的空隙,同时字符串的长度也应相应减少(这个问题我总是忘,希望大家注意),这样才能完成题目要求。
代码如下:
#include<stdio.h>
#include<string.h>
int main()
{
	
char a[1000];
int b,s,i,j,k,l,n;
gets(a);
b=strlen(a);
for(i=0;i<b;i++)
{
if(a[i]==' ')
{
n=0;
for(j=i;j<b;j++)
{
if (a[j]==' ') n++;
else break;
}
if(n>1)
{
for(k=0;k<n-1;k++)
{   
    for(l=i+1;l<b;l++)
    a[l]=a[l+1];
    b--; 
}
}
}
}
printf("%s",a);
return 0;
}
其他的题目虽然也不简单,但没有以上两道题具有代表性,对此本人深有体会。