一、说明
文章用于个人学习C++代码编写使用,前期只会简单的将代码粘贴上来,没时间整体说明。
后续会慢慢完善文章体系。
所有文章会放置在《C++代码编程》栏目里
所有的题目均来源于C语言网
ps:所有代码都是自己编写实现并通过的,可能不是最优解,后续会编写相应的最优解在文章后面
二、题目
题目描述
输入一行字符,分别统计出其中英文字母、数字、空格和其他字符的个数。
输入格式
一行字符,长度不超过200
输出格式
统计值
样例输入
aklsjflj123 sadf918u324 asdf91u32oasdf/.';123
样例输出
23 16 2 4
三、解题思路
思路:题目要求统计四个部分:字母、数字、空格和其他字符,因此就需要分开单独考虑。
题目给定输入为一行字符,其中包括空格,因此不能直接使用cin输入,因cin遇到空格结束读取。
故设变量为string类型,且使用getline()函数进行输入读取。
另:考虑到C++中string类型本质上是一个char类型的数组,因此可以按照数组的逻辑进行考虑。将string变量每个字符看成一个单独的字符,因此考虑使用循环读取每个字符进行判断的逻辑。
四、代码实现
错误代码:共5处错误点
#include<iostream>
#include<string>
using namespace std;
int main()
{
string str;
int a,b,c,d; //错误点1:统计数据没有初始化定义为0;
getline(cin,str);
for(int i = 0; i < str.length(); i++){ //错误点2:int是有定义类型,string属于无定义类型,int和string无法进行比较,修改为 “unsigned int i = 0”
if((str[i] > 'a' && str[i] < 'z') || (str[i] > 'A' && str[i] < 'Z')) //错误点3:统计字母包含a、z和A、Z,应该是 >= 和 <=
a++;
else if(str[i] >= 0 && str[i] <= 9) //错误点4:string类型是char类型的扩展,本质上str[i]数组中存储的是char类型,转换成数字存储的是ascii码,这样比较会出错,故应该改成'0'、'9',和字符比较
b++;
else if(str[i] == " ") //错误点5:错误类型和错误点4类似,本质上是char类型,char类型使用' '单引号括起来
c++;
else
d++;
}
cout << a << " " << b << " " << c << " " << d;
}
错误运行截图:
正确代码:
#include<iostream>
#include<string>
using namespace std;
int main()
{
string str; //定义string类型的变量,记得头文件<string>
int a=0,b=0,c=0,d=0; //初始化定义统计值变量,a表示字母,b表示数字,c表示空格,d表示其他字符
getline(cin,str); //cin输入遇到空格会自动停止,因此不能使用cin输入,使用geiline函数输入
for(unsigned int i = 0; i < str.length(); i++){ //str为string类型,本质是char类型,无标志,直接和int类型无法比较,需要设置unsigned
//数组中存储的是ascii码,可以使用ascii码进行比较,也可以直接使用字符进行比较
if((str[i] >= 'a' && str[i] <= 'z') || (str[i] >= 'A' && str[i] <= 'Z'))
a++;
else if(str[i] >= '0' && str[i] <= '9')
b++;
else if(str[i] == ' ')
c++;
else
d++;
}
cout << a << " " << b << " " << c << " " << d;
}