C# · 12月 20, 2021

C++字符串和字符的分割与转换

今日一些小见解。

//未初始化错误

string a;

a[0]=’1’;

//未初始化错误

string *q;

q[0]=”a”;

想单独为未初始化的string逐个增加元素:

string str;

str.pushback(“a”);

char与string不能直接转换,但是string[i]的类型就是char

const char* 和char* 之间不能直接转换。

const char* p=”abcde”;

这样的指针就是指向常量的指针,不能通过指针来修改它所指向的数据.。

因此从string转换的指针也是指向常量的指针。

string str=“world”;

const char *cp = str.c_str();//同上,要加const或者等号右边用char*

否则,在调用函数的时候,会显示*const char 和char 之间不兼容***

因此,二者转换需要一个过渡。

const char* cp = “world”;

char* p = new char[100];

strcpy(p,cp);

cout << p << endl;

这样就可以通过p来改变原来’‘abcde’’的值了.

由此,string也转变成了char* 。

今日任务是

根据昨天的经验,我先单行读入,再分离空行

#include

#include

#include

using namespace std;

int main()

{

string buffer;

getline(cin,buffer);

stringstream ss(buffer);

string str;

while (ss >> str)

{

…程序主体。

}

return 0;

}

之后需要处理的就是对string类的str进行能否转换成数字,或者是符号就变成char的转换。

注意这里是可以直接str[0]这么用的。

由此对字符串的输入处理就完成啦!

顺便放一个昨天从文本读入行的对比,真的太像啦。只是多了一个打开文件后,让文件连接流,在调用getline那里是链接,而从缓冲区读入的话,直接就是cin了!

string fileName = “retail.dat”;

ifstream in;

in.open(fileName.data(),ios::in); //将文件流对象与文件连接起来

assert(in.is_open());//如果打开失败,这里会终止运行

string buffer;

while (getline(in,buffer))//一次读取文件的一行内容,含空格,为buffer的字符串

{

int temp;

stringstream ss(buffer); //建立stringstream对象,初始化流内容为buffer所代表的字符串

while (ss >> temp) //从buffer中一次次读取数字存入temp,直到到达字符串流的末尾

{

…对ss进行操作

}

}

in.close();