多行输入回车监测截至
有那么一种情况,输入的数据可以是以一行一行的形式读入,这一行中可能包括了空白字符,比如说,某一个带有空格的句子。每输入一句,就将这一行的数据进行处理做出相应的输出,然后继续等待下一行结束。最后,当监测到输入的是回车符号的时候,就结束循环。
while (true)
{
string s;
getline(cin, s);
if (s.size() == 0)
{
break;
}
cout << s<< endl;
从指定字符串中提取出数字,并利用
比如今天要求从“m=3,n=2”中提取出数字来进行运算,我用的方法是,检测第一个等于号的位置和第一个逗号的位置,算出逗号和等号之间的字符串,然后截取第2个等号的位置,直接输出-(第二个等号的位置);
这里有一个小方法
vector<string> devideBychar(string s,char c)
{
//分割类似于这样的函数: “this isdas buuhthsg sdah sdas csd”;或者this,sdhahs,sdasd,sdas,sad
//采用字符串自己提供的内置函数
vector<string> vc;
int start = 0;//查找字符串的起始位置
int loca = 0;//找到的位置
while (loca != -1)
{
loca = s.find(c, start);
string sub = s.substr(start, loca - start);
//cout << sub<<" ";//输出检测
vc.push_back(sub);
start = loca + 1;
}
return vc;
}
采用C++string分割的方法能够简单的处理这种工作,
当然string.sub(star,length)函数有一种这样的用法:
string s ="12345678";
string sub = s.substr(5,-1);
cout<<sub<<endl;
猜猜结果是啥,结果是5678也就是第一个参数对应的位置后面的所有的字符,也就是说
当第二参数为负数的时候,substr()函数的返回值是从i到最后一个字符的字串。
C++中的整数型字符串转整数,这样一定要记得
std::stoi(string)
std::to_string
这两个函数一定要会灵活运用,这一些是必不可少的,那问你一个问题,如何从控制台输入提取两个浮点数?
比如,输入
m=3.1234,b=3.232
要求你提取出m,b的值?
这里有两种方法。1通过字符分割的方式求出小数的整数部分和小数部分,然后将两个部分加起来,这种方法比较费时间,但是如果是不知道其他函数库的情况下迫不得已也是没有办法的啦
double ExtratEnd(string s)
{
//输入类似于"m=3.1412926";
s = "m=3.141573";
//输入: 3.1415926 步骤:找到等号,找到逗号,截取逗号后面一段和等号到逗号的一段
int dot = s.find('.', 0);
int equ = s.find('=', 0);
string zhengshu = s.substr(equ + 1, dot - equ - 1);
int z = stoi(zhengshu);//整数部分
string xiaoshu = s.substr(dot + 1, -1);
int x = stoi(xiaoshu);//小数部分,整数部分转化为double类型然后加上小数部分的整数/1000000.。。0的个数是xiaoshu的位数
double res = (double)z + (double(x) / (double)(pow(10, xiaoshu.size())));
cout << xiaoshu<<endl;
cout << res << endl;
double i = 0;
return i;
}
思路二
我们知道,直接从输入流中传入给一个浮点型的变量是可以的。类似于这样:
#include<iostream>
using namespace std;
double s;//本地浮点型变量
cin>>s;//从输入流中传输给浮点型的变量
但是这种只是适合于纯数字类型的输入流,当类似于“m=3.1415938”;这种就没有办法处理了
实际上呢可以有这样一种处理方法:
string a = "123.32"; //一个字符串
double res;//浮点变量用于接受
stringstream ss;//字符流对象
ss << a;//将字符输出给字符流对象
ss >> res;//字符流对象输入给浮点型数据进行自动转化
cout <<res << endl;
cin.get();
我们首先提取出字符变量“4.2312”;然后将其转化为一个流对象,既然不能转化为cin对象,我们就将其专户为字符串流对象
stringstream ss;
再利用变量输出到流对象,流对象输入到数字变量的方式可以实现转化。
《fstream》
既然都讲到这里了,我们干脆来回忆一下文件流对象:
文件流对象进行输出和输入的过程为:
写文件流程:`
1 包含头文件
#include<fstream>
2创建输出流对象
ofstream ofs;
3 开发文件
ofs.open(filename,open_option);
4 写入字符数据
ofs<<"写入的数据";
5 关闭输出流对象
其中的open_option一定要记得,这种面试笔试中最最最最常考的内容:
开方式 | 解释 |
---|---|
ios::in | 为读文件而打开文件 |
ios::out | 为写文件而打开文件 |
ios::ate | 初始位置:文件尾 |
ios::app | 追加方式写文件 |
ios::trunc | 如果文件存在先删除,再创建 |
ios::binary | 二进制方式 |
读文件流程:
#include <fstream>//包含流头文件
#include <string>
void test01()
{
ifstream ifs; //创建输入流对象
ifs.open("test.txt", ios::in);//以一定的方式打开文件
if (!ifs.is_open()) //异常检测,判断文件是否打开成功
{
cout << "文件打开失败" << endl;
return;
}
//第一种方式
//char buf[1024] = { 0 };
//while (ifs >> buf)
//{
// cout << buf << endl;
//}
//第二种
//char buf[1024] = { 0 };
//while (ifs.getline(buf,sizeof(buf)))
//{
// cout << buf << endl;
//}
//第三种
//string buf;
//while (getline(ifs, buf))
//{
// cout << buf << endl;
//}
char c; //记住最常用的几种方式
while ((c = ifs.get()) != EOF)
{
cout << c;
}
ifs.close();
}