C/C++中的输出字符串分割和对齐

一直都在用C/C++但用的都是库,像什么opencv啊,gdal啊,cuda啊等等。我们做的事情很多都只是调用它们的API,反而C/C++自身的库用得少了,很多基本的都忘记了。就像我们走得太快灵魂跟不上一样。有时候我们得停下脚步等等自己的灵魂。

下面是今天项目中用到的一些基本函数:

首先是写了一个分隔字符串的函数,给定一个字符串和一个字符,将字符串分隔成多个段,这个功能在C#和python等语言中是字符串类型的一个自带的方法,但是在C++的字符串中没有提供,要自己实现,代码如下:

vector<string> split(const string &source, char separator)
{
	vector<string> components;
	size_t startPos=0;
	size_t findPos=0;
	size_t strLen=source.length();
	while (startPos<strLen)
	{
		findPos=source.find_first_of(separator,startPos);
		if (findPos==-1)
		{
			string sunStr=source.substr(startPos);
			if (!isAllBlank(sunStr))
			{
				components.push_back(sunStr);
			}
			break;
		}
		else
		{
			size_t len=findPos-startPos;
			if(len==0)
			{
				startPos=findPos+1;
				continue;
			}
			else
			{
				string sunStr=source.substr(startPos,len);
				startPos=findPos+1;
				if (isAllBlank(sunStr))
				{
					continue;
				}
				components.push_back(sunStr);					
			}		
		}
	}
	return components;
}

上面有一个判断是不是都是空格的函数isAllBlank(sunStr),因为我们的项目中不需要全为空格的项所以舍去,这个函数的实现如下:

bool isAllBlank(const string &source)
{
   basic_string <char>::size_type findIndex = source.find_first_not_of(" ");
   if (findIndex == string::npos)
   {
	  return true;
   }
   return false;
}

经过测试上面的代码还是比较稳定的。



下面是文字对齐的方法,因为要输出一个浮点型的矩阵到一个文本文件中,由于浮点数参差不齐,为了好看我们将它输出的时候进行对齐。首先我们要确定输出的浮点型的有效位数,比如我们的有效位数是12那我们可以像下面这样先将浮点数转换为字符串:

char numbuffer[32];
gcvt(values[c], 12, numbuffer);

之后我们在用下面的代码将字符串输出并进行20个字符的对齐:

fprintf(pStream, "%20s",numbuffer);

上面是右对齐,如果是想左对齐可以将格式字符串改为"%-20s" ,加一个负号就可以了。


有人说上面的太复杂,直接用下面的代码一句就可以了:

fprintf(pStream,"%9.5f",value);

但是这样的话如果我们的数字超过了14位,它就会不对齐了,因为他不会截断,而我们用gcvt函数的话如果数字太长,它会帮我们用科学计数法表示,这样我们输出的内容就肯定是对齐的了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值