C++输入包含空格的字符串,输出最大值出现次数

考虑到直接cin>>字符串不包含空格,也就是你输入alsk(*7  jd  as j21k   21 LKS Jd!*&

只会输出alsk(*7

下面我将展示三种思路

代码1

gets(str)    #include<stdio.h>

代码

#include<iostream>
#include<cstring> //strlen(str)
#include<stdio.h> //gets(str)
using namespace std;

int main()
{
    char str[1000];//防止空间不够超限报错
    gets(str);//gets()使空格等作为字符串一部分
    char s = '0' - 48;//ASCII为0,作为保存ASCII最大值的字符变量
    int a = 0;//保存最大值出现次数
    for(int i = 0; i < strlen(str); i++)
    {
        if(str[i] > s)
            s = str[i];
    }
    for(int i = 0; i < strlen(str); i++)
        if(str[i] == s)
            a += 1;
    cout<<a<<endl;

    return 0;
}

输入输出 

12345 7777 33 999
3

分析 

1,gets()是C语言的函数

2,strlen()以字符串结束符'\0'作为结束标志,返回字符串中'\0'前面的字符个数,且只能求字符数组的字符串长度

类似的函数比如

#include<iostream>
#include<cstring>//strlen()
using namespace std;

int main()
{
    char str[] = "Apex\0Battle";//定义一个字符数组
    string str2 = "Apex\0Battle";

    cout<<strlen(str)<<endl;//输出4
    //cout<<strlen(str2)<<endl;//error: can not convert string to const char

    cout<<sizeof(str)<<endl;//输出12
    cout<<sizeof(str2)<<endl;//输出24

    cout<<str2.size()<<endl;//输出4
    //cout<<str.size()<<endl;//error: request for member 'size' in 'str'


    return 0;
}

strlen(str)str.size()都是求字符串结束符 '\0' 前的长度,但strlen()求的是字符数组的,而.size()求的是string类

4
12
24
4

代码2

cin.get(str, n)    n表示数组长度

代码

#include<iostream>
#include<cstring> //strlen()
using namespace std;

int main()
{
    char str[1000];//1000防止超限
    cin.get(str, 1000);
    char s = '0' - 48;//ASCII为0,作为保存ASCII最大值的字符变量
    int a = 0;//保存最大值出现次数
    for(int i = 0; i < strlen(str); i++)
    {
        if(str[i] > s)
            s = str[i];
    }
    for(int i = 0; i < strlen(str); i++)
        if(str[i] == s)
            a += 1;
    cout<<a<<endl;

    return 0;
}

输入输出

HLIJljkljl 2387 1029 akj zzzz zz z
7

分析

1,

char c;
c = cin.get();可以读取单个字符

2,

char str[1000];
cin.get(str, n); 可以读取一行包含空格的字符串,n为接收字符数目
且cin.get()读取一行时,换行符'\n'会残留在输入缓冲区

3,

strlen()能求字符数组中 \0 前的字符串长度

代码3

getline(cin, str)    #include<string>

代码

#include<iostream>
#include<string>//getline(cin, str)
using namespace std;

int main()
{
    string str;
    getline(cin, str);
    char s = '0' - 48;//ASCII为0,作为保存ASCII最大值的字符变量
    int a = 0;//保存最大值出现次数
    for(int i = 0; i < str.size(); i++)
    {
        if(str[i] > s)
            s = str[i];
    }
    for(int i = 0; i < str.size(); i++)
        if(str[i] == s)
            a += 1;
    cout<<a<<endl;

    return 0;
}


输入输出

alksj 83292 h IUG K  z 83y zzzzz zz
8

 分析

1,

由代码1可知,

getline(cin, str)的确成功把含有空格的字符串保存在str,但是strlen()不能求string str这样的字符串长度

2,

所以考虑用.size()来求长度,.size()能求包含空格的Sring类字符串长度,返回 \0 前的长度

总结 

1,关于长度

strlen()适用于字符数组字符串,比如char str[1000],返回 \0 前的长度

.size()适用于string类字符串,比如string str,返回 \0 前的长度

2,关于包含空格字符串的输入

cin.get(),输入的是字符数组字符串

getline(cin, str)输入的是string类字符串

3,

所以当需要输入string str时,getline(cin, str) + .size(),头文件#include<string>

当输入char str[n]时,cin.get() + strlen(),头文件#include<cstring>

最后演示一遍

两种都可以

#include<iostream>
#include<string> //getline(cin, str);
using namespace std;

int main()
{
    string s1;
    char s2[1000];
    /*
    //char
    cin.get(s2, 1000); //(char字符串, 长度)
    cout<<s2<<endl;
    */
    //string
    getline(cin, s1);
    cout<<s1;
    return 0;
}
18273 asdkj 嘎嘎
18273 asdkj 嘎嘎
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千帐灯无此声

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值