通过这个试验可以练习一下用户和控制台交互的过程。
这是华为的一道机试题:
输入一段字符,碰到‘*’舍弃,遇到‘#’取消本次输入。例子:
若输入:How are** you!
输出:How are you!
不能使用文件操作函数,不能包含.h头文件。不能加预编译指令。
(1)下面是使用scanf 、string 、sprintf三个函数来实现。
// 文本编辑.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
int main(int argc, char* argv[])
{
char recvChar;
string rstStr("");
char tmpBuf[2]={'\0','\0'};
//处理输入
while(1)
{
scanf("%c",&recvChar);
if(recvChar == '\n')
break;
else if(recvChar == '*')
continue;
else if(recvChar == '#')
rstStr = "";
sprintf(tmpBuf,"%c",recvChar);
rstStr += string(tmpBuf);
}
//对输入的字符串进行处理
string::size_type rstLen = rstStr.size();
for(string::size_type i = 0;i<rstLen;i++)
{
if(rstStr[i] == '#')
{
rstStr = "";break;
}
}
cout<<rstStr<<endl;
return 0;
}
(2)使用scanf和string实现
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
int main(int argc, char* argv[])
{
string rstStr("");
char recvChar[2]={'\0','\0'};
//处理输入
while(1)
{
scanf("%c",&recvChar[0]);
if(recvChar[0] == '\n')
break;
else if(recvChar[0] == '*')
continue;
else if(recvChar[0] == '#')
rstStr = "";
rstStr += string(recvChar);
}
//对输入的字符串进行处理
string::size_type rstLen = rstStr.size();
for(string::size_type i = 0;i<rstLen;i++)
{
if(rstStr[i] == '#')
{
rstStr = "";
}
}
cout<<rstStr<<endl;
return 0;
}
(3)使用scanf cevtor和string实现
#include "stdafx.h"
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main(int argc, char* argv[])
{
char tmpChar;
std::vector<char>rst;
while(1)
{
scanf("%c",&tmpChar);
if(tmpChar == '\n')
break;
else if(tmpChar == '*')
continue;
else if(tmpChar == '#')
rst.clear();
rst.push_back(tmpChar);
}
std::vector<char>::iterator it = rst.begin();
for(;it!=rst.end();it++)
{
if(*it == '#')
{
rst.clear();
break;
}
}
string rst2;
rst2.assign(rst.begin(),rst.end());
cout<<rst2<<endl;
return 0;
}
(4)使用getline和string::iterator实现
由于cin不接收空格,仅能接收基本类型数据;所以采用getline来接收cin输入的一行数据
#include "stdafx.h"
#include <string>
#include <iostream>
using namespace std;
int main()
{
string myStr;
getline(cin,myStr);
string::iterator it;
for(it = myStr.begin();it!= myStr.end();it++)
{
if(*it == '*')
{
myStr.erase(it);
it--;
}
else if(*it == '#')
{
myStr.erase();
break;
}
}
cout<<myStr;
return 0;
}
补充一下
为什么回车两次才有输出结果?答:因为getline函数在读到限定符后还要读取额外字符... 感觉是读取一个字符来判断是否eof.体现在键盘输入的方式上就是要输入两次回车. 应该算一个BUG.
getline的另一个用法
如果用户输入字符‘e’,后面的不接收。
#include "stdafx.h"
#include <string>
#include <iostream>
using namespace std;
int main()
{
char str[10] = {0};
cin.getline(str,10,'e');
cout<<string(str)<<endl;
return 0;
}
另外介绍下字符串流用法
标准头文件 <sstream> 定义了一个叫做 stringstream 的类,使用这个类可以对基于字符串的对象进行像流(stream)一样的操作。这样,我们可以对字符串进行抽取和插入操作,这对将字符串与数值互相转换非常有用。
例如:
#include "stdafx.h"
#include <string>
#include <iostream>
#include <sstream>
#include <iomanip>
using namespace std;
template <class T>
std::string fmt(T in, int width = 0, int prec = 0) //格式化数值,使其变为字符串,输出固定格式
{
std::ostringstream s;
s << std::setw(width) << std::setprecision(prec) << in;
return s.str();
}
int main()
{
string myStr("");
getline(cin,myStr);
float myFloat ;
stringstream(myStr)>>myFloat;
myStr = fmt(myFloat,8,5);
cout<<myStr;
return 0;
}