题目要求:输入一个英文句子,将每个单词的第一个字母改成大写字母。
思路:开始用一个数组,通过一个循环记录每个词组之间的空格位置,再通过第二个循环将空格后一位的字母减32(注意第一个词组需要之前没有空格,需要加上相关代码处理)。
代码如下:
#include <stdio.h>
#include <string.h>
//大小写字母之间相差32
int main(){
char a[100];
int loc[100];
int len,i,n;
while(gets(a)){
n=0;
len=strlen(a);
for(i=1;i<len;i++){
if(a[i]==' '){//字符需要用''来赋值!!
loc[n++]=i;//i记录了空格的位置,第一个空格的前后两个字母需要进行大写处理
}
}
a[loc[0]-1]=a[loc[0]-1]-32;//问题出在这里!倘若句子开头不是一个字母,就会产生错误。
a[loc[0]+1]=a[loc[0]+1]-32;
for(i=1;i<n;i++)
a[loc[i]+1]=a[loc[i]+1]-32;//这里怎么能直接复制粘贴呢!!
printf("%s\n", a);
}
}
然而测试之后出现问题,经检查发现问题所在,问题已通过注释给出。
在discuss中得到灵感,将循环次数缩减为一次。
代码如下:
#include <stdio.h>
#include <string.h>
//大小写字母之间相差32
int main(){
char a[100];
int loc[100];
int len,i,n;
while(gets(a)){
len=strlen(a);
a[0]=a[0]-32;
for(i=1;i<len;i++){
if(a[i]==' ')
a[i+1]=a[i+1]-32;
}
printf("%s\n", a);
}
}
这题和之前的题目存在一点不同:while()中的语句变为了gets(),它的作用是直接从缓冲区中读入一行字符串并且将最后的\n抛掉。而scanf()的读取机制为遇到空格就停下,不满足本题的要求。
很多需求通过一次循环即可完成,需要培养这种意识,避免代码过于臃肿。