在c++中,字符串表示方法有两种,一是使用字符的数组结构 (也称作C风格字符串),比如char c[10] = {"cramile"},另一种是c++添加的string类,比如string s = "cramile"。今天就好好学习下两者的不同
C风格的字符串的操作函数均位于cstring头文件中(c++标准化后的string.h)。具体的实现与c语言没有不同,不再赘述。(想要知道所有的函数?去看cstring文件啊)
string类是在c++98标准中添加,要使用string类,就必须在头文件中包含“string”头文件。
string类定义隐藏了字符串的数组性质(其实还是个字符数组,不过被隐藏掉了),另外由于iostream引入的时间要早于string类,所以在iostream类中的cin,cout的实现中没有考虑string类,但是却可以用cin与cout来操作string类,这是因为以后将会接触到的“友元函数”的概念,在这里先mark一下。
c++与java类在使用上极其相似,相较于c风格的字符串使用起来要简单很多,由于java基础自认尚可,故跳过该段,若以后实际应用中发现区别,再回来补充。
诸如此类:
cout << "cra" "mile" << endl;c++会将第一个字符串末尾的‘a’后面的’\0’字符自动替换成第二个字符串的第一个字符’m’,所以最后的输出仍为”cramile”。
cin函数检测输入字符串是以:’ ‘(空格),’\0’,’\n’作为输入结束的标志,所以如果我们想要一个字符串的内容为”Hello World”,当我们使用cin>>输入字符串的时候,实际上在o与W之间的空格的时候cin就认为本次输入结束,并将”Hello”复制给字符串,将”World”存放在输入流中,当第二次调用`cin>>“的时候自动将”World”赋值给下一个变量。
这里就有一个问题,如果下一个变量不是字符串类型呢,比如说int类型,结果就是不对该变量做任何修改,同时仍然将”World”存放至输入流中。
所以需要输入带有空格的字符串的时候,我们就要使用面向行的输入函数:cin.getline(str , str_size)与cin.get(str , str_size),两者均可,只是行为稍有不同,这个稍后讨论。
假设我们要对一个长度9的字符串赋值,但是输入长度却大于字符串长度,这种情况下不同的输入函数会有什么反应呢。 直接贴出代码,结果写在注释里
//The String we'll input is "abcdefghigklmn" char c[9]; cin >> c;//运行报错,提醒读写内存越界 cin.get(c,sizeof(c));//写满字符串之后监测到输入流中仍然有字符,则完成赋值。 cin.getline(c,sizeof(c));//写满字符串之后监测到输入流中仍然有字符,则完成赋值并使能失效位,关闭后面的输入,但是输入流并不清空(使能失效位在文章的最后有介绍)前面说到的cin.get()都是有传入参数的,而这个没有传入参数,同一个函数名能有不同的实现方式是因为函数的重载,这个概念应该与java完全相同,略过。 cin.get()的作用是获取输入流的下一个字符,可以用来跳过不想要的字符,或者配合它的有传参版通过检测换行符来确定输入流中是否还有其他数据。
如果需要对string对象赋值有空格的字符串,那么cin>>是不能胜任的,这时候我们就需要类似cin.getline()这样的函数,所以我们就有了getline()函数,通过如下调用:
getline(cin ,str);就可以实现想要的功能。
使能失效位:使输入流失效,即无法输入数据,同时之后的所有cin函数全部无法工作,解决办法是键入cin.clear()重置失效位。
