单词统计与单词首字母大写
之前刷OJ也刷过三四道和单词统计或单词首字母的题。今天又遇到了类似的,却比以前更简单的方法。放在博客上备忘。
题目大致的意思:用户输入字符串,统计输入的单词个数,单词以空格隔开。并且将每个单词的首字母大写。
之前一贯的思路:首先如果第一个字符为字母,则count++,并让首字母大写,然后在for循环判断,每个空格后面的字母一定是另外一个单词,count++并且把首字母大写。如果有多个空格(即空格后还是空格),则不做任何操作。代码如下:
// main.c
// 统计单词个数并将首字母大写
//
// Created by DXY on 16/7/28.
// Copyright © 2016年 DXY. All rights reserved.
//
#include <stdio.h>
int main(int argc, const char * argv[]) {
char s[100];
int i,c=0;
gets(s);
//查案第一个字符是否为字母,如果是,则c++
//并且判断首字母是否大写,如果不大写则变为大写
if(s[0]>='a' && s[0]<='z'){
c++;
s[0] -= 32;
}else if(s[0]>='A' && s[0]<='Z'){
c++;
}
for(i=0;s[i]!='\0';i++){
if(s[i]==' '){ //如果本字符为空格
//如果本字符为空格且下个字符为字母,则c++,并且判断是否为小写字母,把小写字母改为大写
if(s[i+1]>='a' && s[i+1]<='z'){
c++;
s[i+1] -= 32;
}else if(s[i+1]>='A' && s[i+1]<='Z'){
c++;
}
}
}
printf("单词个数为:%d\n",c);
puts(s);
return 0;
}
另外一个思路:默认字符串里除了空格就是字母,那么设置一个标志变量,一开始为0,以表示一开始就是字母的情况,如果遇到空格,则标志置0,表示接下来有新单词了。如果一直有空格,则会忽视(因为一直在左标志置0操作)。如果下一个字符不为空格且标志==0,则表示这是空格后的字母,则counter++,且把首字母大写。 //解释的不太好,看不太懂的直接看代码 :)
// main.c
//
// 计算字母个数简单算法
// Created by DXY on 16/7/28.
// Copyright © 2016年 DXY. All rights reserved.
//
#include <stdio.h>
int main(int argc, const char * argv[]) {
int words = 0,i,c=0; //words是一个标志变量
char s[100];
gets(s);
for(i=0;s[i]!='\0';i++){
if(s[i] == ' '){
words = 0; //如果遇到空格,就标志为0,下个字符若遇到的是空格,则还执行相同语句
//若遇到字母,则到else if里
}else if(words == 0) {//在已经遇到过空格的情况下(即words为0),下次如果遇到的不是空格,就一定是字母。所以执行c++
c++;
s[i] -= 32;
words = 1; //统计过这个单词,重新把标志置1,
}
}
puts(s);
printf("单词个数为:%d\n",c);
return 0;
}