处理字符串的两种方式:字符数组和string类库
一、字符数组:
1、字符串的初始化:char str1[4] ={'q','w','e','r'};//字符数组,不是字符串
charstr2[5] = {'q','w','e','r','\0'};//用字符数组来存储字符串
以上几种方式都是正确的,在输出上也没有什么区别,都可以直接用 cout<<srt1; 这种方式来打印数组。
但是如果这样写:
charst3[3] = {"qwe"};//用字符数组存储字符串常量
是错的,因为"qwe"是字符串常量,系统会自动在后面加上'\0',必须留出一位用来存储'\0'来表示字符串的结束;
利用cin初始化数组:
注意两点:
编译器会自动在最后加'\0',用户输入时编译器通过空格和回车以及tab来确定一个字符串的结束。
测试:如果定义一个字符数组(足够长),利用cin获取值,再验证字符串后面会不会自动加'\0'?
代码:
#include<iostream>
using namespace std;
int main(int argc,char** argv) {
chara[10];// = {'q','w','e','r'};
cin>>a;
int b= (int)a[3];
cout<<b;
return0;
}
方法:先后输入三个字符和四个字符。
结果:第一次输出0('\0'的ASCII码值),第二次输出的是最后一位字符的ASCII码值。即会自动加'\0'。
这里有一个问题:如果定义数组长度为3,但是在用户输入两个以上字符时,vs会报错,devcpp不会报错。
如何解决想要录入带空格的字符串呢?
getline:
这是一个可以录入一行字符的函数,遇到回车即停止,并且用'\0'替代输入队列的回车。
cin.getline(str:数组名,length:想要录入的长度);
如果输入长度大于length-1(编译器需要一位来存储'\0'),则多余部分不录入。
getline函数的返回值类型还是cin,所以getline函数可以连续调用,如:cin.getline(str1,10).getline(str2,20);
get:
与getline用法几乎相同,唯一区别就是利用get不会替代掉输入队列的回车,而是将其保留下来,所以当再次调用时就会因为第一个字符就是回车而让这次没有录入字符。
二、string类:
字符数组的缺点:1、无法实现数组的动态定义(数组的大小必须在编译时确定,就是说必须在编写时就要确定数组的大小,用户无法定义。)
2、不安全,容易读取到数组接线以外
string类初始化字符串:
使用string类必须在头文件中包含<string>
string str1;//初始化字符串长度为0
string str2 = "hello";//定义时直接初始化
cin>>str1;//利用cin初始化字符串变量,字符串大小根据用户输入长度来定(解决了字符数组的弊端)
掌握最简单的一个用法,“+”法,可以对字符串进行拼接。更多用法移步:cpp——string常用函数用法总结#include <iostream>
using namespace std;
int main(int argc, char** argv) {
string str1;
string str2 = "hello!";
cout<<"请输入一个名字:\n";
cin>>str1;
cout<<str1 +" " + str2 ;
}