C/C++ split函数 num2str str2num函数

article/2025/9/15 14:02:07

C/C++ split函数,num2str及str2num函数实现

在C98及其以下版本的C/C++中,没有现成的字符串split函数和num2str及str2num函数,对于竞赛不能使用C11的我来说非常头疼,通过学习stringstream和strtok实现了自己的split函数,通过stringstream和sscanf以及sprint实现了num2str及str2num函数。

1. split函数

split函数顾名思义,用来分割字符串,用stringstream实现地函数只能分割空格间隔的字符串,而用strtok实现可以分割任意字符串(这里用的是字符串,意思是可以是单个字符也可以是多个字符作为分隔符)间隔的字符串。

1.1 stringstream实现

/*
split_sstream 用stringstream实现以空格分割字符串
输入为string类型变量s 
输出为经过空格分割后,存储在vector中的字符串数组
*/
vector<string> split_sstream(string s){stringstream ss;string ans_s;vector<string> ans_v;ss << s;while(ss >> ans_s){ans_v.push_back(ans_s);}return ans_v;
}

1.2 strtok函数实现

/*
split_strtok 用strtok实现以delim分割字符串
输入为string类型变量s和分割字符delim 
输出为经过空格分割后,存储在vector中的字符串数组
*/
vector<string> split_strtok(string s, const char* delim = " "){string ans_s;char * pointer = NULL;vector<string> ans_v;//转换string to char*char* s_char = new char[s.size()];strcpy(s_char, s.c_str());pointer = strtok(s_char, delim);while(pointer != NULL) {ans_s = pointer;ans_v.push_back(ans_s);//这里用NULL的原因://源码中会判断是否是第二次调用//如果是第二次调用,就会从上次结束的位置后的字符串作为开始 pointer = strtok(NULL, delim);}return ans_v;
}

2. str2num函数

str2num,即str to num函数,将字符串转换成数字的函数,数字可以是整数也可以是浮点数。

2.1 stringstream函数实现

/*
str2num_sstream 用sstream实现将字符串转换成数字 
输入为string类型变量s
输出为double类型变量 
*/double str2num_sstream(string s){stringstream ss;ss << s;double ans_d;ss >> ans_d;return ans_d; 
}

2.2 sscanf、sprintf实现

/*
str2num_sscanf_sprintf 用sscanf和sprintf实现将字符串转换成数字 
输入为string类型变量s
输出为double类型变量 
*/double str2num_sscanf_sprintf(string s){const char* s_char = s.c_str();double ans_d;//sscanf用法和scanf类似,第一个参数表示输入来源,这里即将s_char的内容以%f的形式送给ans_d //注意double用%lf,以及double前面的& sscanf(s_char, "%lf", &ans_d);return ans_d;
}

3. num2str函数

num2str, 即num to str函数,将数字转换成对应的字符串的函数,同样的数字可以是整数和浮点数。

3.1 stringstream函数实现

/*
num2str_sstream 用sstream实现将数字转换成字符串
输入为double类型变量num
输出为string类型变量 
*/ 
string num2str_sstream(double num){stringstream ss;string ans_s;ss << num;//1ss >> ans_s; //2ans_s = ss.str() ;return ans_s;
} 

3.2 sscanf、sprintf实现

/*
num2str_sscanf_sprintf 用sscanf和sprintf实现将数字转换成字符串
输入为double类型变量num
输出为string类型变量 
*/ 
string num2str_sscanf_sprintf(double num){string ans_s;char* s_char;sprintf(s_char, "%lf", num);ans_s = s_char;return ans_s;	
} 

4. 函数测试

测试函数及主函数代码:

//遍历vector 
void printVector(vector<string> v){vector<string>::iterator it = v.begin();while(it != v.end()){cout << *it << endl;it++;}cout << endl;
}//测试上述所写函数功能是否正常 
void test(string s1, string s2, double num){vector<string> ans_v;string ans_str; double ans_d;//测试split ans_v = split_sstream(s1);cout << "split_sstream函数运行结果:" << endl;printVector(ans_v);ans_v = split_strtok(s1, " ");cout << "split_strtok函数运行结果:" << endl;printVector(ans_v);//测试str2num ans_d =  str2num_sstream(s2);cout << "str2num_sstream函数运行结果:" << endl;cout << ans_d << endl << endl;ans_d =  str2num_sscanf_sprintf(s2);cout << "str2num_sscanf_sprintf函数运行结果:" << endl;cout << ans_d << endl << endl;//测试num2strans_str =  num2str_sstream(num);cout << "num2str_sstream函数运行结果:" << endl;cout << ans_str << endl << endl;ans_str =  num2str_sscanf_sprintf(num);cout << "num2str_sscanf_sprintf函数运行结果:" << endl;cout << ans_str << endl << endl;
}int main(){test("I LOVE U","123.456", 789.10);cout << endl;test("Hello World","777", 888); //split delim测试vector<string> ans_v;ans_v = split_strtok("If I were you, I won't do it, right?", ",");cout << "以逗号\',\'分割结果为:" << endl; printVector(ans_v);ans_v = split_strtok("If I were you*! I won't do it*! right? *!", "*!");cout << "以星号+感叹号\'*!\'分割结果为:" << endl; printVector(ans_v);return 0;
}

测试结果:
测试结果

5. GitHub资源

本文章.md文件及.cpp源代码见个人GitHub仓库:

URL: https://github.com/Little-Chen-T/Zhihu

HTTPS: https://github.com/Little-Chen-T/Zhihu.git


http://chatgpt.dhexx.cn/article/JaorXkLy.shtml

相关文章

matlab 中num2str函数的使用

运行ECO代码报错&#xff1a;转义字符 ‘\d’ 无效。有关支持的特殊字符&#xff0c;请参阅 ‘doc sprintf’。 num2str函数功能&#xff1a;将数字转换为字符串 具体所有功能可见官网。 这里使用的格式为&#xff1a; str num2str(A, format) 将 format 指定的格式应用到 A …

js基础运用——js用*打印三角形,菱形

js基础运用 新手见解&#xff0c;有不足或更简单的方法希望各位指点 1.用*排列直角三形 &#xff08;图一&#xff09; &#xff08;图二&#xff09; 图一图二是js语句利用*号画出来的直角三角形&#xff0c;方法思路都一致&#xff0c;下面以图一为例讲一下本人所用的方法…

java:打印十字图

java:打印十字图 题目 问题描述 小明为某机构设计了一个十字型的徽标&#xff08;并非红十字会啊&#xff09;&#xff0c;如下所示&#xff1a;..$$$$$$$$$$$$$.. ..$...........$.. $$$.$$$$$$$$$.$$$ $...$.......$...$ $.$$$.$$$$$.$$$.$ $.$...$...$...$.$ $.$.$$$.$.$$…

JAVA 利用JFram,JPanel,JScrollPane简单文本框实现

****1.JFram 支持通用窗口的所有基本功能 2…JPanel是一个无边框&#xff0c;不可以被移动的&#xff0c;放大的&#xff0c;缩小的&#xff0c;或者关闭的面板&#xff0c;默认布局是FlowLayout&#xff08;也可用setLayout&#xff08;&#xff09;来设定&#xff09;** 3……

deflater java_Java Deflater finished()用法及代码示例

如果已到达压缩数据输出流的末尾&#xff0c;则java.util.zip中Deflater类的finished()函数将返回true。 函数签名&#xff1a; public boolean finished() 用法: d.finished(); 参数&#xff1a;该函数不需要参数 返回类型&#xff1a;该函数返回布尔值&#xff0c;即如果所有…

jQuery API ( 三 ) -------- 链式编程 与 修改样式方法

今天这篇文章是 jQuery API 的第三篇&#xff0c;今天心情很好&#xff0c;因为破了300粉&#xff0c;希望所有代码人前端人在编程与写作的路上都能一帆风顺&#xff0c;全都早日拿认证。okk言归正传&#xff0c;这篇文章将带大家走进链式编程的世界&#xff0c;这也是 jQuery …

jsfiddle 使用教程

最近有许多的Css 3 demo&#xff0c;因此为了方便查阅&#xff0c;就将demo部分放在 jsfiddle &#xff0c;方便日后翻阅。 这是 JSFIDDLE 的官网文档&#xff0c;都是英文&#xff0c;不过对照看还是可以的&#xff1a;官方文档 HTML区域&#xff1a; 它的HTML区域已经包含 ht…

Jfinal 框架 在Html页面使用 #if(调用java方法) #end

欢迎转发分享&#xff0c; 转发请附上本文地址&#xff1a; https://blog.csdn.net/Luoxianxun/article/details/106399780 一、实现需求 实现在html 中使用 #if(调用java类中的方法) #end&#xff1b; 二、使用技术 JFinal后台框架 JFinal 官方文档&#xff1a;https://jfi…

java文本框代码_Java Swing JTextField文本框的代码示例

1. 概述 官方JavaDocsApi: javax.swing.JTextField JTextField&#xff0c;文本框。JTextField 用来编辑单行的文本。 JTextField 常用构造方法: /* * 参数说明: * text: 默认显示的文本 * columns: 用来计算首选宽度的列数&#xff1b;如果列设置为 0&#xff0c;则首选宽度将…

java的StringBuilder、Stringjoiner

一、StringBuilder StringBuilder可以看成是一个容器&#xff0c;创建之后里面的内容是可变的。作用是提高字符串的操作效率。 注意&#xff1a;使用String创建字符串对象时&#xff0c;是不能改变字符串的内容的&#xff0c;例如&#xff1a; String s1 "aaa"; St…

swing的JTextField的介绍及其使用方法

:JTextField的(文本框)使用: JTextField 是一个轻量级组件&#xff0c;它允许编辑单行文本。 1.JTextField的常用构造方法: JTextField() 构造一个新的 TextField。 JTextField(int columns) 构造一个具有指定列数的新的空 TextField。 JTextField(String text) 构造一个用…

十字链表简介与实现(Java)

十字链表简介与实现&#xff08;Java&#xff09; 结构实现 结构 十字链表存储有向图&#xff08;网&#xff09;的方式与邻接表有一些相同&#xff0c;都以图&#xff08;网&#xff09;中各顶点为首元节点建立多条链表&#xff0c;同时为了便于管理&#xff0c;还将所有链表…

Java输出一个*号十字架

总共9行 每一行4个空格除了第五行不要空格 每一行1个*除了第五行需要9个* 利用for的循环嵌套方法&#xff0c;用三个for 从上往下 第一个for代表行数&#xff0c;第二个for代表空格数&#xff0c;第三个for代表输出的*数 做法如下:

Java 写一个简单的"十字"

如何用代码写出十字&#xff1f; 首先创建一个新的Package&#xff0c;如图&#xff1a; 取一个com.➕名字缩写和日期&#xff0c;下一行写public class 类名&#xff0c;后面加上一个{ },在它的中间写上public static void main&#xff08;String[] args){, 如图&#xff1a…

JTextField的部分常用使用方法

本篇文章将会教会大家如何使用JTextField输入框 1.创建JTextField和添加 //创建输入框 JTextField jTextField new JTextField(); //将标签添加到面板里 jPanel.add(jTextField);2设置JTextField大小坐标 //设置输入框大小 jTextField.setSize(300,100); //设置输入框坐标…

Exists 用法解释

exists的实例解析 现有两个表 a&#xff1a; b: 现有sql语句如下 select * from a where exists (select 1 from b where b.b_id a.id); 执行结果如下&#xff1a; 含义解析&#xff1a;exists 的意思是用于检查子查询是否至少会返回一行数据&#xff0c;该子查询实际上并不…

MySQL中的EXISTS用法

EXISTS 语法&#xff1a; SELECT 字段 FROM table WHERE EXISTS (subquery); 参数&#xff1a; subquery是一个受限的SELECT语句&#xff08;不允许有COMPUTE子句和INTO关键字&#xff09; 示例&#xff1a; SELECT * FROM A WHERE EXISTS (SELECT 1 FROM B WHERE B.id …

EXISTS用法

EXISTS用于检查子查询是否至少会返回一行数据&#xff0c;该子查询实际上并不返回任何数据&#xff0c;而是返回值True或False 方法/ 1 EXISTS用于检查子查询是否至少会返回一行数据&#xff0c;该子查询实际上并不返回任何数据&#xff0c;而是返回值True或False EXISTS 指定一…

hivesql中 exists 用法

有一次面试的时候&#xff0c;面试官问了这么一个场景题&#xff1a;一家门店一个月内每位顾客访问的目的可能有多种&#xff0c;并给到访顾客的目的打标签1、2、3、4这四类&#xff0c;现在要统计这家门店一个月内没有3、4标签的顾客明细。&#xff08;也就是顾客到访标签只有…

mysql中not exists用法_not exists用法

not exists是sql中的一个语法,常用在子查询和主查询之间,用于条件判断,根据一个条件返回一个布尔值,从而来确定下一步操作如何进行,not exists也是exists或in的对立面。 not exists 是exists的对立面,所以要了解not exists的用法,我们首先了解下exists、in的区别和特点:…