目录
前言
别学计算机。
一、题目
不包含字符串头文件,手搓代码实现字符串的输入功能并计算输入中有效字符的数量。
二、分析
我们首先要有一个字符数组str,一个统计变量count(要初始化滴思密达)
1.字符串的输入输出。(目的为检查自己编写的代码是否可以完整读取字符串)
2.字符串总长度的统计。
3.在字符串中遍历,遇到ASCII码表中的字符则计数变量自增。
三、代码
1.字符串输入输出部分:
#include<iostream>
using namespace std;
int main()
{
int count = 0;
char str[30];
cin >> str;
cout << str;
cout <<str[i]<<" ";
}
2.字符串长度的统计:
#include<iostream>
using namespace std;
int main()
{
int count = 0;
char str[30];
cin >> str;
cout << str;
for (int i = 0; ; i++)
{
if (str[i]!='\0')//如果不是字符串的结束,那么就继续遍历
count++;
else //否则跳出循环
break;
}
cout << " " << count;
}
3.有效字符的识别:
这个部分我们要判断我们所输入的字符是否是由键盘直接输入的,如果是那么统计变量就自增,否则不变。我们这里的思路就是通过ASCII码表来判断是否为有效字符。表中我们可以看到,键盘上能输入的字符的编码为32-126,因此我们想到将字符编码>=32&&<=126作为判断条件。
ASCII码表
代码实现如下:
#include<iostream>
using namespace std;
int main()
{
int count = 0;
char str[30];
cin >> str;
cout << str;
for (int i = 0;; i++)
{
if (str[i]>=32&&str[i]<=126)//判断该字符是否属于ASCII码表
count++;
else if(str[i]=='\0')
break;
}
cout << " " << count;
}
四、问题
至此,我们大部分的问题就基本解决了(撒花)!但是,多次运行之后,我还发现这串代码有那么亿点点小问题就是:cin无法实现空格的输入;但是我们要的是字符串啊!回车才是一个字符串输入的结束啊。于是,我找到了C语言中的gets函数可以输入空格,但是遇到回车会终止输入,这个函数在VS里面是gets_s。所以我进行了进一步的优化。代码修改如下:
注:gets_s函数在头文件<stdio.h>中,调用之前别忘了引用一下~
#include<iostream>
#include<stdio.h>
using namespace std;
int main()
{
int count = 0;
char str[30];
gets_s(str);
for (int i = 0;; i++)
{
if (str[i]>=32&&str[i]<=126)
count++;
else if(str[i]=='\0')
break;
}
cout << "该字符串有效字符长度为" << count;
}
调试结果:
样例分析:
样例1特点为纯数字
样例2特点为字母数字混合字符串
样例3特点为含有空格的字符串
样例4特点为含有汉字,汉字我们认为其不是有效字符,故字符串长度为5
样例5特点为数字与符号相结合,我们认为符号属于有效字符,故字符串长度为5
五、致谢
特别鸣谢:华南师范大学计算机学院网络工程专业C++程序设计与实验课名师宋桂琴,孕育了这篇文章,特此感谢。