20220813
char ch;
cin >> ch; //读取下一个输入的字符,但是会忽略空格和回车符
ch = cin.get(); //读取下一个输入的字符,不会忽略空格和回车符
cin.get(ch); //读取下一个输入的字符,不会忽略空格和回车符
cout << "ch = " << ch << "_" << endl;
(如果刚开始输入空格或者回车符是被当做没有输入内容,只有输入一个单词后再遇到空格和回车就结束)
char name[30];
cin >> name;//遇到空格和回车就结束
cout << name << "_" << endl;
string str;
cin >> str;//遇到空格和回车就结束
cout << str << "_" << endl;
int num;//double num;
cin >> num;
//num = cin.get();//读取输入的下一个字符(包括空格符和回车符),赋给ch char-->int
//空格是32,回车是10, 输入2结果是50, 输入22结果也是50
//cin.get(num);//报错,(这种方式只能用于char类型的字符)
cout << num << endl;
遇到空格不结束,遇到回车才结束!!!
char name[30];
cin.getline(name, 30);//遇到空格不结束,遇到回车才结束
cout << name << "_" << endl;
string str;
getline(cin, str);//遇到空格不结束,遇到回车才结束
cout << str << "_" << endl;
1.以'#'作为结束符:(回车、空格不统计在内)
char ch;
vector<char> vec;
cin >> ch;//会忽略空格和回车
while(ch != '#'){
//ch不等于结束符,再存入到vector中
vec.push_back(ch);
cin >> ch;//会忽略空格和回车
}
for(auto it : vec) cout << it << "; ";
cout << endl;
2.以'#'作为结束符:(回车、空格也要统计在内)
char ch;
vector<char> vec;
//cin >> ch;//会忽略空格和回车
ch = cin.get();//不会忽略空格和回车
while(ch != '#'){
//ch不等于结束符,再存入到vector中
vec.push_back(ch);
//cin >> ch;//会忽略空格和回车
ch = cin.get();//不会忽略空格和回车
}
for(auto it : vec) cout << it << "; ";
cout << endl;
3.以'\n'作为结束符:(空格也会被统计在内)
char ch;
vector<char> vec;
ch = cin.get();//不会忽略空格和回车
while(ch != '\n'){
//ch不等于结束符,再存入到vector中
vec.push_back(ch);
ch = cin.get();//不会忽略空格和回车
}
for(auto it : vec) cout << it << "; ";
cout << endl;
4.以'\n'作为结束符:(空格不统计在内)
这个涉及到遇到连续空格的情况...
char name[30];
char ch;
do{
cin >> name;//遇到空格、回车符就算结束
cout << name << "_\n";
ch = cin.get();//下一个字符是否为回车符
}while(ch != '\n');
string str;
char ch;
vector<string> vec;
do{
cin >> str;//遇到空格、回车符就算结束
ch = cin.get();//下一个字符是否为回车符
vec.push_back(str);
}while(ch != '\n');
for(auto it : vec) cout << it << "; ";
cout << endl;
int num;//double num;
char ch;
vector<int> vec;
do{
cin >> num;
ch = cin.get();//下一个字符是否为回车符
vec.push_back(num);
}while(ch != '\n');
for(auto it : vec) cout << it << "; ";
cout << endl;
上来就输入空行的话就直接返回:(推荐)
string str;
vector<string> vec;
getline(cin, str);//先输入一行
while(str != ""){//判断是否为空行
vec.push_back(str);
getline(cin, str);
}
for(auto it : vec) cout << it << "_" << endl;
上来就输入空行的话会把空行也打印出来:
string str;
vector<string> vec;
//getline(cin, str);
do{
getline(cin, str);
vec.push_back(str);
}while(str != "");
for(auto it : vec) cout << it << "_" << endl;
空格作为间隔符,把字符串分割成多个部分#include
#include
#include
using namespace std;
//索引实现
vector<string> split(const string &str)
{
vector<string> ret;
int start = 0, end = 0;
while (end < str.size())
{
//非空字符一直走
while (end < str.size() && str[end] != ' ')//空格作为分隔符
end++;
//截取
if (start < end)
{
ret.push_back(str.substr(start, end - start));
start = end;
}
//跳过连续空格
while (end < str.size() && str[end] == ' ')//空格作为分隔符
{
end++;
start = end;
}
}
return ret;
}
int main(){
string str;
getline(cin, str);//输入一行字符串
//cout << "解析前:" << str << endl;
vector<string> vec;
vec = split(str);//以空格作为间隔符,把字符串分割成多个部分
//cout << "解析后:";
for(auto it : vec) cout << it << "; ";//\n
cout << endl;
return 0;
}
空格作为间隔符,把每个字符串分割成多个部分int main(){
string str;
vector<string> vec;
cout << "请输入一行字符串:(回车符作为单行结束的标志,空行作为输入结束的标志)";
getline(cin, str);//先输入一行
while(str != ""){//判断是否为空行
vec.push_back(str);
cout << "解析前:" << str << endl;
//每输入一行,就解析一行:
vector<string> tmp;
tmp = split(str);//以空格作为间隔符,把字符串分割成多个部分
cout << "解析后:";
for(auto it : tmp) cout << it << "; ";//\n
cout << endl;
cout << "请输入一行字符串:(回车符作为单行结束的标志,空行作为输入结束的标志)";
getline(cin, str);
}
cout << "输入结束!" << endl;
return 0;
}
多种间隔符把字符串分割成多个部分)1.一堆字符串放在指针数组中:(用C++实现)
(下面的2.2 示例2(其他字符作为间隔符)中 还有个C语言版本)
#include
#include
using namespace std;
int main(){
int w,h,f;
const char *modeList[8] = {
"1920x1080p60.00-0",
"1920x1080i60.00-2",
"1920x1080p50.00-4",
"1920x1080i50.00-5",
"1280x720p60.00-14",
"1280x720i50.00-16",
"720x576p50.00-21",
"720x480p59.94-23"
};
//遍历指针数组:数组的元素个数 = 数组大小 / 单个元素的大小 (指针数组中的元素都是指针,所以是char*)
for(int i = 0; i < sizeof(modeList) / sizeof(char*); i++){
//输出当前行:
cout << "解析前:" << modeList[i] << endl;
//解析当前行:
string str = modeList[i];
vector<string> vec(3);
int j = 0;
while(j < str.size()){//j++
while(str[j] != 'x') {vec[0].push_back(str[j]); j++;} j++;//跳过'x'
while(str[j] != 'p' && str[j] != 'i') {vec[1].push_back(str[j]); j++;} j++;//跳过'p'或者'i'
while(str[j] != '-') {vec[2].push_back(str[j]); j++;} break;//遇到'-'就解析结束,退出for循环
}
//输出解析后的内容:
cout << "解析后:" << vec[0] << ", " << vec[1] << ", " << vec[2] << endl;
}
return 0;
}
2.一对字符串放在vector中:
#include
#include
#include
using namespace std;
int main(){
int w,h,f;
vector<string> vec = {
"1920x1080p60.00-0",
"1920x1080i60.00-2",
"1920x1080p50.00-4",
"1920x1080i50.00-5",
"1280x720p60.00-14",
"1280x720i50.00-16",
"720x576p50.00-21",
"720x480p59.94-23"
};
for(int i = 0; i < vec.size(); i++){
//输出当前行:
cout << "解析前:" << vec[i] << endl;
//解析当前行:
string str = vec[i];
vector<string> tmp(3);
int j = 0;
while(j < str.size()){//j++
while(str[j] != 'x') {tmp[0].push_back(str[j]); j++;} j++;//跳过'x'
while(str[j] != 'p' && str[j] != 'i') {tmp[1].push_back(str[j]); j++;} j++;//跳过'p'或者'i'
while(str[j] != '-') {tmp[2].push_back(str[j]); j++;} break;//遇到'-'就解析结束,退出for循环
}
//输出解析后的内容:
cout << "解析后:" << tmp[0] << ", " << tmp[1] << ", " << tmp[2] << endl;
}
return 0;
}
(总结的内容到此结束)
如果是用char数组,
char name[20];
int num;
//读一个单词:
cin >> name;
cin.get();//消除结束符
//读一个数字:
cin >> num;
cin.get();//消除结束符
//读一整行
cin.getline(name, 20);
如果是用string对象,
string str;
int num;
//读一个单词:
cin >> str;
cin.get();//消除结束符
//读一个数字:
cin >> num;
cin.get();//消除结束符
//读一整行
getline(cin, str);
char ch;
cin >> ch; //方式1(会忽略空格符和回车符)
ch = cin.get(); //方式2(不会忽略空格符和回车符)读取输入的下一个字符(包括空格符和回车符),赋给ch
cin.get(ch); //方式2'(这种方式只能用于char类型的字符)
循环读一个字符、一个数字:
方式1:
char ch;
int count = 0;
//cin >> ch;//5.5.1 会忽略空格和换行符
//cin.get(ch);//5.5.2 读取输入的下一个字符(包括空格符和回车符)
ch = cin.get();
while (ch != '#') {//#作为结束符
cout << ch;//把输入的内容进行输出
count++;
//cin >> ch;//5.5.1 会忽略空格和换行符
//cin.get(ch);//5.5.2 读取输入的下一个字符(包括空格符和回车符)
ch = cin.get();
}
cout << "共输入了 " << count << " 个字符。" << endl;
方式2:
int num; vector<int> vec;
double num; vector<double> vec;
char num; vector<char> vec;
while(1){
if(!(cin >> num)) break; //(会忽略空格符和回车符)
//if(!(cin.get(num))) break; // 报错,这种方式只能用于char类型的字符
vec.push_back(num);
}
for(auto it : vec) cout << it << ", ";
cout << endl;
#include
#include
#include
using namespace std;
//索引实现
vector<string> split(const string &str)
{
vector<string> ret;
int start = 0, end = 0;
while (end < str.size())
{
//非空字符一直走
while (end < str.size() && str[end] != ' ')//空格作为分隔符
end++;
//截取
if (start < end)
{
ret.push_back(str.substr(start, end - start));
start = end;
}
//跳过连续空格
while (end < str.size() && str[end] == ' ')//空格作为分隔符
{
end++;
start = end;
}
}
return ret;
}
题目:

代码:
#include
#include
#include
using namespace std;
//索引实现
vector<string> split(const string &str)
{
vector<string> ret;
int start = 0, end = 0;
while (end < str.size())
{//非空字符一直走
while (end < str.size() && str[end] != ' ')
end++;
//截取
if (start < end)
{
ret.push_back(str.substr(start, end - start));
start = end;
}
//跳过连续空格
while (end < str.size() && str[end] == ' ')
{
end++;
start = end;
}
}
return ret;
}
int main(){
string str;
//getline(cin, str);//手动输入
str = "55 45 05 06 07 08 09 0A C7";
vector<string> vec = split(str);
//输出分割后的各个部分
for(auto it : vec) cout << it << "; ";
cout << endl;
cout << "协议头:" << vec[0] << endl;
cout << "地址:" << vec[1] << endl;
cout << "数据长度:" << vec[2] << endl;
int num = stoi(vec[2]);
cout << "有效数据:";
for(int i = 0; i < num; i++) cout << vec[3 + i] << ", ";
cout << endl;
cout << "校验和:" << vec[3 + num] << endl;
return 0;
}
编译运行:
55; 45; 05; 06; 07; 08; 09; 0A; C7;
协议头:55
地址:45
数据长度:05
有效数据:06, 07, 08, 09, 0A,
校验和:C7
核心代码是这部分:
//解析当前行:
string str = modeList[i];//当前行
vector<string> vec(3);//三种分隔符,或者说是吧字符串分成三部分
int j = 0;
while(j < str.size()){//j++
while(str[j] != 'x') {vec[0].push_back(str[j]); j++;}
j++;//跳过'x'
while(str[j] != 'p' && str[j] != 'i') {vec[1].push_back(str[j]); j++;}
j++;//跳过'p'或者'i'
while(str[j] != '-') {vec[2].push_back(str[j]); j++;}
break;//遇到'-'就解析结束,退出for循环
}
//输出解析后的内容:
cout << vec[0] << ", " << vec[1] << ", " << vec[2] << endl;
解析指针数组中的字符串常量,把字符串中的内容按不同的分隔符分开
题目:


代码:(C++)
#include
#include
using namespace std;
int main(){
int w,h,f;
const char *modeList[8] = {
"1920x1080p60.00-0",
"1920x1080i60.00-2",
"1920x1080p50.00-4",
"1920x1080i50.00-5",
"1280x720p60.00-14",
"1280x720i50.00-16",
"720x576p50.00-21",
"720x480p59.94-23"
};
//遍历指针数组:数组的元素个数 = 数组大小 / 单个元素的大小 (指针数组中的元素都是指针,所以是char*)
for(int i = 0; i < sizeof(modeList) / sizeof(char*); i++){
//输出当前行:
cout << modeList[i] << endl;
//解析当前行:
string str = modeList[i];
vector<string> vec(3);
int j = 0;
while(j < str.size()){//j++
while(str[j] != 'x') {vec[0].push_back(str[j]); j++;} j++;//跳过'x'
while(str[j] != 'p' && str[j] != 'i') {vec[1].push_back(str[j]); j++;} j++;//跳过'p'或者'i'
while(str[j] != '-') {vec[2].push_back(str[j]); j++;} break;//遇到'-'就解析结束,退出for循环
}
//输出解析后的内容:
cout << vec[0] << ", " << vec[1] << ", " << vec[2] << endl;
}
return 0;
}
代码:(C语言)
#include
#include
#include
int main(){
const char *modeList[8] = {
"1920x1080p60.00-0",
"1920x1080i60.00-2",
"1920x1080p50.00-4",
"1920x1080i50.00-5",
"1280x720p60.00-14",
"1280x720i50.00-16",
"720x576p50.00-21",
"720x480p59.94-23"
};
//遍历指针数组:数组的元素个数 = 数组大小 / 单个元素的大小 (指针数组中的元素都是指针,所以是char*)
for(int i = 0; i < sizeof(modeList) / sizeof(char*); i++){
//输出当前行:
printf("%s\n", modeList[i]);
//解析当前行:
char str[100];
strcpy(str, modeList[i]);
//printf("---%s, len = %ld\n", str, strlen(str));
//int w,h,f; w = h = f = 0;
char wChar[20];
char hChar[20];
char fChar[20];
int j = 0;
while(j < strlen(str)){//j++
int k = 0;
while(str[j] != 'x') {wChar[k++] = str[j++]; } wChar[k] = '\0'; j++;//跳过'x'
k = 0;
while(str[j] != 'p' && str[j] != 'i') {hChar[k++] = str[j++];} hChar[k] = '\0'; j++;//跳过'p'或者'i'
k = 0;
while(str[j] != '-') {fChar[k++] = str[j++];} fChar[k] = '\0'; break;//遇到'-'就解析结束,退出for循环
}
//printf("len = %ld, %ld, %ld; ", strlen(wChar), strlen(hChar), strlen(fChar));
strncpy(wChar, wChar, strlen(wChar));
strncpy(hChar, hChar, strlen(hChar));
strncpy(fChar, fChar, strlen(fChar));
//输出解析后的内容:
//w = atoi(wChar); h = atoi(hChar); f = atoi(fChar);
//printf("%d, %d, %d\n", w, h, f);
printf("%s, %s, %s\n", wChar, hChar, fChar);
}
return 0;
}
来自C++ Primer Plus - 第四章中的4.13 编程练习 第1题 ;
和 C++ Primer Plus - 第五、六章中的5.5 循环和文本输入 和 5.8 复习题 第9题 区分cin >> ch; 和 cin.get(ch); 和 ch = cin.get(); ☆☆☆
总结:
char name[20]; string str;或一个数字int num; 或一整行string name; char name[20]; —就看①char ch; —就看③和②具体内容:
①(看一下第四章-编程练习-第1题下面的综述)
| 实现方式 | 读取一个单词或数字 | 读入一整行 |
|---|---|---|
| 字符数组 | char ch[20]; cin >> ch; cin.get();//消除结束符 int num; cin >> num; cin.get();//消除结束符 | char name[20]; cin.getline(name,20); |
| string对象 | string str; cin >> str; cin.get();//消除结束符 int num; cin >> num; cin.get();//消除结束符 | string name; getline(cin,name); |
②函数cin.get()重载:(1和2适合读单个字符,3适合读一整行字符串)
char ch; ch = cin.get();//没有参数,返回值为输入中的下一个字符char ch; cin.get(ch);//一个参数char类型,参数是引用类型,直接将读到的字符赋给参数chchar name[20]; cin.get(name,20);//两个参数:字符数组名,一次接收的字符数上限(③见第四章的 4.13 编程练习 的 第1题 )③如果要读取单个字符char ch;通常使用3种方式
(推荐用后两种方式,也就是上面②的1和2),
| char ch; | ①cin >> ch; cin.get();//消除结束符 | ②cin.get(ch); cin.get();//消除结束符 | ③ch = cin.get(); cin.get();//消除结束符 |
|---|---|---|---|
| 特点 | 将不会读入空白字符(空格符、换行符、制表符),所以不推荐 | 将会读取所有ASCII字符并将其保存在ch变量中,具体见上面②的1 | 将会读取所有ASCII字符并将其保存在ch变量中,具体见上面②的2 |
//5.5.1 5.5.2
char ch;
int count = 0;
//cin >> ch;//5.5.1 会忽略空格和换行符
//cin.get(ch);//5.5.2 读取输入的下一个字符(包括空格符和回车符)
ch = cin.get();
while (ch != '#') {//#作为结束符
cout << ch;//把输入的内容进行输出
count++;
//cin >> ch;//5.5.1
//cin.get(ch);//5.5.2
ch = cin.get();
}
cout << "共输入了 " << count << " 个字符。" << endl;
//程序2:
char ch;
int count = 0;
while (cin.get(ch)) {//判断是否到达文件尾
cout << ch;
count++;
}
cout << "共输入了 " << count << " 个字符。" << endl;