文本编辑、控制台交互(对* #做处理)

13 篇文章 0 订阅

通过这个试验可以练习一下用户和控制台交互的过程。

这是华为的一道机试题:

输入一段字符,碰到‘*’舍弃,遇到‘#’取消本次输入。例子:

若输入: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;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值