C++基础之C字符串和String

C字符串在C语言中非常流行,但是被C++中更健壮、更方便、更有用的string类型替代了。


1.C 字符串

C字符串是一个字符数组,以’\0’空终结符结尾,显示了内存中的字符串是如何结尾的。每一个字符串值都是一个C字符串,因此可以声明一个数组并用字符串值来初始化它。

char city1[8] = "Beijing";  // C-string
char city2[] = {'B','e','i','j','i','n','g'};    // Not a C-string

注意,city1数组大小是8,最后一个字符是’\0’。

1.1 输入和输出C字符串

标准输入输出:
接受一个字符串,遇到“空格”、‘“TAB”、“回车”结束。

char s[8];
cin >> s;   // scanf("%s",s);
cout << s << endl;

cin.getline(char array[], int size, char delimitchar)
当遇到 终结符delimitchar(默认是“\n”)或者读取了size-1个字符后函数停止读入字符,最后一个字符被空终结符替代。

char s1[10];
char s2[10];
cin.getline(s1,10);  //遇到"\n"结束
cin.getline(s2,8,' '); //遇到' '结束 ,且只读入7个字符
1.2 C字符串函数

所有函数均在头文件<cstring>下,除了转换函数atoi、atof、atol在头文件<cstdlib>下。

函数 描述
size_t strlen(char s[]) 返回字符串的长度
strcpy(char s1[] , const char s2[]) 将字符串s2复制到s1中
strncpy(char s1[] , const char s2[]) 将字符串s2中前n个符号复制到s1中
int atoi(char s[]) 返回字符串对应的int型值
double atof(char s[]) 返回字符串对应的double型值
long atol(char s[]) 返回字符串对应的long型值

注,atoi中相当于 array to integer

2.String

String是C++中的字符串型,包含在头文件<string>中。

2.1 string的输入和输出

标准输入输出:
接受一个字符串,遇到“空格”、‘“TAB”、“回车”结束。

string s;
cin>>s;
cout << s << endl;

getlin(cin,str,delimitchar)
包含在头文件<string>中,接受一个字符串,可以接收空格,也可以自己指定终结符delimitchar。

注意,cin.getline()属于istream流;
getline()属于string流,是两个不同的函数。

getchar()
接受一个字符,需要包含头文件<string>

2.2 string的常用函数
函数 描述
stoi string转int
stof string转float
stod string转double
to_string 数字转string
substr(begin [,n]) 返回从begin位置开始的n个字符组成的子串
size()或length() 返回字符串的长度
str1.compare(str2) 字符串比较

注意:
在 C++中string是一个类,所以调用某些函数的格式object.substr(begin,n);

测试程序:

#include <iostream>
#include <string>

using namespace std;

int main() {
    string str = "123";
    int a = stoi(str);
    cout << a;
  	str = "123.44";
    double b = stod(str);
    cout << b;
    return 0;
}
/*
stoi如果是非法输入:
1.会自动截取最前面的数字,直到遇到不是数字为止
    (所以说如果是浮点型,会截取前面的整数部分)
2.如果最前面不是数字,会运行时发生错误
*/

/*
 stod如果是非法输入:
 1.会自动截取最前面的浮点数,直到遇到不满足浮点数为止
 2.如果最前面不是数字或者小数点,会运行时发生错误
 3.如果最前面是小数点,会自动转化后在前面补0
 */

/*
相应的还有:
stof(string to float)
stold(string to long double)
stol(string to long)
stoll(string to long long)
stoul(string to unsigned long)
stoull(string to unsigned long long)
*/

3.cin和getline()连用陷阱

#include<iostream>
#include<string>

using namespace std;

int main(){
	string name;
	string local;
	cout<<"输入你的名字:\n";
	cin>>name;
	cout<<"输入你的所在地:\n";
	getline(cin,local);
	cout<<"名字:"<<name<<endl;
	cout<<"所在地:"<<local<<endl;
}

输入和输出

输入你的名字:
jack
输入你的所在地:
名字:jack
所在地:

可以看见在请求输入所在地的时候,自动跳过了。

而输入jack c
则输出
名字:jack
所在地: c

原因:在输入流中,jack后面还留有一个换行符被getline()所吸收,且停止读入了。

解决办法
使用getchar()或者cin.get()等方法将换行符吸收掉。

#include<iostream>
#include<string>

using namespace std;

int main(){
	string name;
	string local;
	cout<<"输入你的名字:\n";
	cin>>name;
	getchar(); //cin.get();
	cout<<"输入你的所在地:\n";
	getline(cin,local);
	cout<<"名字:"<<name<<endl;
	cout<<"所在地:"<<local<<endl;
}

猜你喜欢

转载自blog.csdn.net/Africa_South/article/details/88241887
今日推荐