一道c++基础题:输入一行字符串,不要超过80个字符,要求统计在该字符串中共有多少个整数,并将这些数依次输出。

目录

一、问题描述

二、(对cin.getline和cin.get简要说明↓)


一、问题描述

​

【问题描述】输入一行字符串,不要超过80个字符,含有数字和非数字字符以及空格等,如:
df23adfd56 2343?23dgjop535
如果将其中所有连续出现的数字视为一个整数,要求统计在该字符串中共有多少个整数,并将这些数依次输出。
【输入说明】只有一行,含有数字和其它任意字符。该行最长含80个字符。
【输出说明】第一行为字符串包含的整数个数,第二行依次为各个整数,各整数之间用一个空格分隔。在第二行末也要输出一个回车符。
【输入样例】
 df23adfd56 2343?23dgjop535
【输出样例】
5
23 56 2343 23 535
【样例说明】
在字符串df23adfd56 2343?23dgjop535中有5个整数分别是
23 56 2343 23 535
​

大致思路是:

      因为题目要求还要输出这些连续的数字,不妨定义两个字符数组,一个是要判断的原始字符串,定义另一个用来挑选并存放连续整数,用于后续输出。

       同时int count=0,每存放完一串完整的数字后,count++,以此计数。

首先,如何判断是否数字呢?只需利用ascii码范围即可,0-9分别对应48-57

所以编写一个函数judge,返回1或0,用于在主函数中判断:

int judge(char a)
{
    if(a>=48&&a<=57) 
    return 1;
    else return 0;
}

此时主函数上半部分也可以写好了:

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int judge(char a);          //函数声明,利用ascii码范围判断数字还是字母 
    char arr[80],num[80];
    int count=0;                //计数 
    gets(arr);
    int n;n=strlen(arr);        //string类测长度。或者用arr.length() 
​

注意用了gets()来输入,它可以读取空格,遇到换行符才停止。

二、(对cin.getline和cin.get简要说明↓)

(顺便提一下cin.getline(arr,20),同样可读取空格,在读取完指定数目字符后或者遇到换行符时,停止读取。如例参数为20,则至多读取19个字符,余下空间存储自动添加在结尾的\0。)

(格式类似的,还有cin.get(arr,20),不同的是geline读取并丢弃换行符,而cin.get仅将其留在输入队列中。同样cin也会将回车键生成的换行符留下。一般后面再要输入时,得加一个无参数的cin.get(),读取下一个符号即处理留下的换行符。否则直接输入时会因为检测到换行符而认为已到行尾而不再读取。)

现在可以开始考虑怎样开始存放和计数的操作了。这里我们使用for循环对arr[i]依次判断。

int t=80,k=0;
    int i,j=0;      
    for(i=0;i<n;++i)
	{
        if(judge(arr[i])==1)     //arr[i]这一位字符是数字 ,则==1 
        {   t+=80;
            k=t;
            num[j++]=arr[i];  }
        else k--;
        if(k==t-1)              
		{   num[j++]=' '; 
			count++;  }
    }

此处我们定义变量t和k,利用其大小关系进行判断。

可以看出当if判断是数字时,k=t,并向num[j]存入数字。当arr[i]非数字时,跳到else k--,以便于下面一个if的作用:向下一位num[j]输入一个空格,便于后续数字的存放。

可知:k初值不等于t-1,仅当前一位是数字(执行k=t)而这一位是非数字(k--)时,才有k==t-1,于是才会计数。(t=80是随便设的。其实只要和k不同即可。t+=80也是同理不能+=1,否则影响if(k==t-1)的判断)

简单说就是发生前一位是数字,后一位是字符,这样的分界时,才会计数。那么如果arr最后一位是数字,就无法将其也计算进去了。所以要作如下判断:

if (judge(arr[n-1])==1) count++;
    cout<<count<<endl;
    cout<<num;

return 0;}   至此程序结束。

一些避坑点:

1、char数组里元素为char,char永远不会==数字!!!

2、int数组不可直接输入输出!!!(写cin>>a[80],谬矣。)

3、测string长度用不了strlen(strlen的使用对象只限于char)。
   实在要用strlen就作如下转换:

    string a;
    cin >> a;
    int count;
    count = strlen(a.c_str());
  

这里a.c_str()的意义为:将string类的a暂时转化为char类型,再用strlen测量长度。

这是道比较简单的基础题,板鸭本座觉得这是种可以借鉴的判断方法,于是在此分享一下。没说清楚的地方欢迎各位前来询问。

  • 30
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 16
    评论
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值