codeup 100000580问题 B: 首字母大写
题目描述
对一个字符串中的所有单词,如果单词的首字母不是大写字母,则把单词的首字母变成大写字母。
在字符串中,单词之间通过空白符分隔,空白符包括:空格(’ ‘)、制表符(’\t’)、回车符(’\r’)、换行符(’\n’)。
输入
输入一行:待处理的字符串(长度小于100)。
输出
可能有多组测试数据,对于每组数据,
输出一行:转换后的字符串。
样例输入 Copy
if so, you already have a google account. you can sign in on the right.
样例输出 Copy
If So, You Already Have A Google Account. You Can Sign In On The Right.
本题属于字符串操作类简单题目,思路较为简单,但是实际编程有一些边界问题注意处理。
思路分为如下几步:
1>用一个字符串ch保存输入的任意待处理字符串,之后以单词为分割将这个串读取进一个二维字符数组str保存起来为了下一步按单词处理。
2>遍历字符串数组str,按题目要求处理,具体转化检查每个单词首字母,如果不是大写字母转化即可。
3>输出str即可。
代码如下:
#include <stdio.h>
#include <string.h>
#define max0 101
char ch[max0];
char str[30][30];
int main() {
while (gets(ch)) {
int len=strlen(ch);
int i,r=0,h=0; //r.h分别控制str的行和列,每行即为一个字符串(单词),每行的每列即为单个字符
for(i=0; i<=len; i++) {
if(ch[i]!=' '&&ch[i]!='\t'&&ch[i]!='\n'&&ch[i]!='\r') //过滤单词之间的空白符
str[r][h++]=ch[i]; //不是空白符,则赋值字符
else {
str[r][h]='\0'; //是空白符则意味着一个单词结束,赋\0
r++; //开始下一个单词
h=0; //开始下一个单词的第一个字符
}
}
for(i=0; i<=r; i++) { //转化大写字母
char c=str[i][0]; //保存每个单词首字符
if(c>90) //90为Z的ASCLL值 A-Z(65-90),a-z(97-122),c大于90即为小写字母
str[i][0]=c-32; //转化
}
for(i=0; i<=r; i++) { //输出
if(i==r)
printf("%s\n",str[i]);
else
printf("%s ",str[i]);
}
}
return 0;
}
运行结果:
几个注意事项:
1>本题的意思单词和标点符号是紧挨着,比如account. 所以这种情况即为一个单词
2>`
for(i=0; i<=len; i++) {
if(ch[i]!=' '&&ch[i]!='\t'&&ch[i]!='\n'&&ch[i]!='\r') //过滤单词之间的空白符
str[r][h++]=ch[i]; //不是空白符,则赋值字符
else {
str[r][h]='\0'; //是空白符则意味着一个单词结束,赋\0
r++; //开始下一个单词
h=0; //开始下一个单词的第一个字符
}
}
这段转化,i为0-len,不是0-len-1,否则最后一个单词少一个\0,输出时会有错误
如下:(读者自行理解为什么会有这种情况)
3> str[20][20]和ch[ ]数组尽量在main函数外面声明。