考虑到直接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 嘎嘎