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;
}