码迷,mamicode.com
首页 > 编程语言 > 详细

C++ 关于字符串的特殊读入和分割问题 *非常重要,基本囊括string相关的输入输出和类型转换问题

时间:2020-02-27 01:15:21      阅读:87      评论:0      收藏:0      [点我收藏+]

标签:如何   fstream   排序   类型转换   传参   log   文件   ack   ble   

后续在做题时的时候遇到了一个从文件里去读取一串逗号分隔的double数字,并排序的问题;

技术图片

 

 

 还是挺操蛋的一道题,用直接读入在分割的方法贼麻烦,所以还是要寻求简单的的库函数和Cpp11特性来进行解决;

 

查阅相关blog,简单聊一下相关的问题;

 

其实最主要的有两个问题:

1.如何读入?能不能一次分割得到string;

2.如果将存放小数的string转换成double;

 

针对于第一个问题,找到了两种方法:

 

其一:利用getline的重载形式,这是自己第一次见;

以前getline(cin,s),只是简单的读入一行,但是其还有另一种形式getline(cin,s,char),其中char就是读入的终止符,如果不写默认情况下就是换行符;

所以可以直接利用这个在对文件读入的时候直接做文章;

while (getline(fin,s,‘,‘)){
	dl.push_back(stod(s));
}

这段代码有两个要点:

1.getline套在while循环里直接进行读入文件尾部判定;

2.对读入的文件利用‘,’进行分割;

 

其二:利用古老的C函数,stroke()进行处理;

这种方法极其操蛋,不到万不得已我觉得还是别用的好,涉及很多自己以前c语言没怎么用过的东西;

while (getline(fin,s)){
        char* c = (char*)malloc((s.size()) * sizeof(char));
        strcpy(c, s.c_str());
        cout << s << endl;
        cout << c << endl;
        char *pc = strtok(c, ",");
        while (pc != NULL) {
            string ss = pc;
            dl.push_back(stod(ss));
            pc = strtok(NULL, ",");
        }
    }

strtok接受两个参数,第一个是数组指针char* c,第二个是一个char* de,传递需要分割的中间符号;

在传参执行成功后,传回第一个分割字符串的首地址;

后续反复调用strtok(NULL,char* de),则会一直返回指向后续分割字符串的指针,可以循环直到返回指针为空,此时分割完毕;

 

重要补充:

在之前刷题中,往往能见到按照空格进行分割的题目,但是往往自己都是按照字符串遍历进行截取输出,这样其实大可不必;

利用stringstream即可;

stringstream在iostream头文件中,可以利用字符串进行流的输入输出模拟,并且输出的时候可以按照空格进行割裂,割裂成好几个字符串;

	while (getline(fin,s)){
		stringstream ss(s);
		string s1;
		while (ss >> s1) {
			dl.push_back(stod(s1));
			//cout << s1<<endl;
		}
	}  

初始化和fstream类似,直接初始化,模拟输出即可。由于stringstream模仿的是流,所以向string输入字符也要类似于cin>>s;

 

 

针对于第二个问题,也是老生常谈的问题:

又涉及到string和int、double、char* 之间的转换问题;

 

针对于string转int、double:

这是一个牛皮的转换,第一次见。。。

string s;
cin >> s;
stringstream ss(s);
double d; ss >> d;

本质上和之前的stringstream模拟流输入一毛一样,当定义double类型的时候,直接可以利用流输入,使得系统自己识别出来这是个double数字,这个同理;

 

或者直接直接利用string库函数:

stod(string);
stoi(string);

直接可以将string转换为int和double;

 

针对于int和double转string;

直接利用to_string()函数即可;

s = to_string(d);

其中d可以为int或者double;

 

针对于string,char*,char[]:

string转char[],将string.c_str(),转为char*,利用strcpy进行赋值,但是char*要事先用malloc开空间;

char*和char[]对string进行赋值,直接两者等于号赋值即可;

 

C++ 关于字符串的特殊读入和分割问题 *非常重要,基本囊括string相关的输入输出和类型转换问题

标签:如何   fstream   排序   类型转换   传参   log   文件   ack   ble   

原文地址:https://www.cnblogs.com/songlinxuan/p/12370059.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!