最近在跟一门北大C++程序设计的慕课,openjudge上做到一道题,要求定义一种能够输入输出学生姓名,年龄,学号和学年成绩的类。比较特别的是输入的形式是以逗号隔开的一长串字符串。

我用的方法通过是通过了,但可能比较笨,主要使用getline获取指定字符之前的字符串,使用强制转换函数stoi()转换成数字。

#include <iostream>
#include <string>
#include <cstdio>
#include <cstring>
#include <sstream>
#include <cstdlib>
using namespace std; class Student {
private:
string m_name, m_id;
unsigned m_age;
double m_av, n[4]; public:
void input()
{
string ts = {};
getline(cin, m_name, ','); //从流中获取姓名的字符串,遇到逗号结束
getline(cin, ts, ','); //从流中获取年龄的字符串
m_age = stoi(ts); //强制转化为整型赋给成员变量m_age
getline(cin, m_id, ','); //从流中获取学号的字符串,赋给成员变量m_id
for (int i = 0; i < 3; i++) //获取前三个学年的成绩,同样用强制转换存值
{
getline(cin, ts, ',');
n[i] = stoi(ts);
}
getline(cin, ts, '\n'); //获取最后一个学年的成绩,遇到换行符结束
n[3] = stoi(ts);
}
void calculate()
{
m_av = (n[0] + n[1] + n[2] + n[3]) / 4; //计算四个学年成绩的平均值
}
void output()
{
cout << m_name << "," << m_age << "," << m_id << "," << m_av;
}
}; int main() {
Student student; // 定义类的对象
student.input(); // 输入数据
student.calculate(); // 计算平均成绩
student.output(); // 输出数据 system("pause");
return 0;
}

这里总结一下我迄今使用的字符串输入输出的方式。

1.cin

cin会从流中取数据,遇到空格或者换行符都会停止,所以不适合读数据串。一般用来取单个变量的数据。

int a; int b;
cin >> a;
cin >> b;
cout << "a:" << a << endl;
cout << "b:" << b << endl;

输入:

2 3(回车)

2(回车)
3(回车)

输出:

a:2
b:3

第一种输入会把换行符之前,即“2+空格+3+\n”的数据都存入缓冲区。程序执行到cin>>a,去缓冲区取数据,碰到空格停止,所以就取走了一个2赋给了a,然后继续执行cin>>b,此时缓冲区如果还残留数据,程序会从缓冲区取数据而不是要求用户输入,所以重复相同的步骤取走了剩余的3。最后,留下一个换行符在缓冲区内

2.cin.get()

cin.get()如果不加任何参数的话,只会每次从缓冲区取一个数据,同样也会留下换行符。要注意的是,cin.get()遇到换行符就会停止,意思是缓冲区如果留有换行符,此时程序执行cin.get()会被直接跳过。cin.get()返回的值可以直接赋给变量。

int a; int b;
a = cin.get();
b = cin.get(); cout << "a:" << a << endl;
cout << "b:" << b << endl;

输入:

abc(回车)

输出:

a:97
b:98

发现cin.get()取的实际是单个字符,如果赋给整型的话就会转化成对应的ASCII值。

再如:

char a, b;
cin >> a;
b = cin.get(); cout << "a:" << a << endl;
cout << "b:" << b << endl;

输入:

1(回车)

输出:

a:1
b:

刚才说过cin>>a读取了回车之前的数据给了a,但会缓冲区留下个换行符。然后cin.get()从缓冲区取数据,遇到换行符直接就跳过了,所以没有提示用户输入,b没有赋值。

如果不把cin.get()的返回值赋给谁,自成一句,那么cin.get()就可以用来清除掉缓冲区的字符

如:

char a[10];

    a[0] = cin.get();
a[1] = cin.get();
cin.get();
cin.get();
a[2] = cin.get(); cout << a[0] << a[1] << a[2] << endl;

输入:

abcde

输出:

abe

cd被推走了,所以只有abe赋了值。

利用这一特性,常留一句cin.get()清掉缓冲区残留的换行符,或者无效的输入。

cin.get()加参数的话,第一项填数据名,第二项填其长度,就可以给特定字符变量输入字符串了。

如:

char a[10];
cin.get(a,10);

3.getline

getline可以给字符串string对象赋值,用法如下:

#include<iostream>
#include<string>
using namespace std; int main()
{
char str1[10];
string str2; cin.get(str1, 10);
cin.get(); //清除换行符
getline(cin,str2); cout << "str1:" << str1 << endl;
cout << "str2:" << str2 << endl; system("pause");
}

输入:

abcd(回车)
hijk(回车)

输出:

str1:abcd
str2:hijk

getline可以指定第三项参数,即遇到特定的字符停止,默认是‘\n’,可以手动写成如‘,’,也就是我在上面例题程序里使用的。

值得注意的是将string转换成int的函数 stoi() 还是挺有用的,需要包含头文件<string>。

string str;
int a ;
cin >> str;
a = stoi(str); cout << "a:" << a << endl;

输入:

100(回车)

输出:

a:100

C++字符串的输入输出整理的更多相关文章

  1. Python内置的字符串处理函数整理

    Python内置的字符串处理函数整理 作者: 字体:[增加 减小] 类型:转载 时间:2013-01-29我要评论 Python内置的字符串处理函数整理,收集常用的Python 内置的各种字符串处理 ...

  2. javascript中字符串常用操作整理

    javascript中字符串常用操作整理 字符串的操作在js中非常频繁,也非常重要.以往看完书之后都能记得非常清楚,但稍微隔一段时间不用,便会忘得差不多,记性不好是硬伤啊...今天就对字符串的一些常用 ...

  3. java中的数据类型,运算符,字符串,输入输出,控制流,大数值,数组; 《java核心技术卷i》 第三章:java基本程序结构;

    <java核心技术卷i> 第三章:java基本程序结构: 每次看书,去总结的时候,总会发现一些新的东西,这次对于java的数组有了更深的了解: java中的数据类型,运算符,字符串,输入输 ...

  4. C语言字符串操作函数整理

    整理C语言字符串相关的函数,以程序方式验证,以注释方式做说明. #include<stdio.h> #include<string.h> #include<stdlib. ...

  5. JS截取字符串常用方法详细整理&&MYSQL

    截取字符串的使用比较广泛,有很多中方法,本文粗略的整理了一些,感兴趣的额朋友可以才参考下 使用 substring()或者slice() 函数:split() 功能:使用一个指定的分隔符把一个字符串分 ...

  6. 字符串之format整理

    format 用法 本文根据官方文档及自己理解整理,只整理出自己可以理解的部分,h因个人水平有限,难免有所错误和纰漏,欢迎批评指正. 格式{ [field_name] ["!" c ...

  7. C语言学习笔记---3.字符串格式化输入输出

    1.C语言字符串 字符串(character string)是一个或多个字符的序列,例如:"Zing went the strings of my heart!" C语言没有专门用 ...

  8. java中的字符串相关知识整理

    字符串为什么这么重要 写了多年java的开发应该对String不陌生,但是我却越发觉得它陌生.每学一门编程语言就会与字符串这个关键词打不少交道.看来它真的很重要. 字符串就是一系列的字符组合的串,如果 ...

  9. JS截取字符串常用方法详细整理

    使用 substring()或者slice() 函数:split() 功能:使用一个指定的分隔符把一个字符串分割存储到数组 例子: str="jpg|bmp|gif|ico|png" ...

随机推荐

  1. C#还原对图像做的修改

    在C#程序中对图像进行处理,有的时候需要将处理后的图像还原,便于观察两者之间的区别,避免重新运行程序造成的麻烦.我是将之前写的Tab页中打开的图像进行还原,将原始图像数据保存在数据流中,然后从数据流中 ...

  2. 我对Flutter的第一次失望

    老孟导读:此文翻译自:https://medium.com/@suragch/my-first-disappointment-with-flutter-5f6967ba78bf 我喜欢Flutter. ...

  3. Auto Generate Reflection Information for C++

    https://www.reddit.com/r/gamedev/comments/3lh0ba/using_clang_to_generate_c_reflection_data/ https:// ...

  4. python3笔记-读取ini配置文件

    在代码中经常会通过ini文件来配置一些常修改的配置.下面通过一个实例来看下如何写入.读取ini配置文件. 需要的配置文件是: [path] back_dir = /Users/abc/PycharmP ...

  5. 使用java.io.RandomAccessFile更改文本文件的内容

    原文本内容: 2020-01-21 08:31:08.520 [main] INFO logbackCfg.App -秦时明月汉时关 2020-01-21 08:31:08.521 [main] ER ...

  6. 关于非标准json格式转变为json对象

    eval('(' + tempData + ')') 只需要这一句

  7. RabbitMQ和Kafka的高可用集群原理

    前言 小伙伴们,通过前边文章的阅读,相信大家已经对RocketMQ的基本原理有了一个比较深入的了解,那么大家对当前比较常用的RabbitMQ和Kafka是不是也有兴趣了解一些呢,了解的多一些也不是坏事 ...

  8. JZOJ1495 宝石

    Description 见上帝动了恻隐之心,天后也想显示一下慈悲之怀,随即从口袋中取出一块魔术方巾,让身边的美神维纳斯拿到后堂的屏风上去试试,屏风是正方形的,高和宽方向上各划有m条鱼屏风的边平行的直线 ...

  9. Node.js 从零开发 web server博客项目[项目介绍]

    web server博客项目 Node.js 从零开发 web server博客项目[项目介绍] Node.js 从零开发 web server博客项目[接口] Node.js 从零开发 web se ...

  10. matlab外部程序接口-excel

    在excel中使用matlab 内容: 1.Spreadsheet Link 程序 安装与启动 1 打开excle->文件->选项 2.加载项->转到 3.浏览(可用加载宏,本来没有 ...