1、字符和字符串(C语言)
C风格字符串的特殊性质:以空字符结尾
“\0”
,其ASCII码为0
char exam1[4] = {'a','b','c','d'}; //not a string!
char exam2[4] = {'a','b','c','\0'}; //a string!
两个数组都是char数组,但只有exam2才是字符串,因为他是以
“\0”
结尾;显示如下:
这是因为在输出时,遇到
“\0”
空字符才会停止输出,而对于exam1而言,会接着打印,直到在内存中遇到
“\0”
,而内存中
“\0”
很常见,所以很快就停止打印输出啦。
在C++中,char数组名、char指针和用引号括起来的字符串常量通常被解释为字符串第一个字符的地址
2、字符串常量
上述单引号且要加上空字符
“\0”
看起来很烦,所以改进为引号括起来的字符串就是:
字符串常量
,如下:
char exam3[] = "The is a string!";
上述声明字符串时,将隐式的包括结尾的空字符。
3、sizeof和strlen函数
sizeof函数计算的是,整个数组的长度(包含空字符);
strlen函数计算的是,字符串的长度(计算可见的字符,不包含空字符);
char exam4[20] = "The is a string!";
cout << sizeof(exam4) << endl;
cout << strlen(exam4) << endl;
结果为:一个20,一个16;
4、字符串输入(面向单词)
在C++中一般使用cin输入各种参数,在输入字符串时,cin使用
空白(空格、制表符、换行符)来确定字符串的结束位置
#include <iostream>
int main()
{
using namespace std;
const int ArSize = 20;
char name[ArSize];
char dessert[ArSize];
cout << "Enter your name:\n";
cin >> name;
cout << "Enter your favorite dessert:\n";
cin >> dessert;
cout << "I have some delicious " << dessert;
cout << " for you, " << name << ".\n";
return 0;
}
在输入时,若连续输入且以空格或者制表位隔开时,例如:
Buyaobilian hhh
输出如下:
这是因为上述输入相当于输入了两个字符串,或者可以每输入一次敲入一个回车,因为
回车代表\n\r,换行和回车
5、字符串输入(面向行)
可以看出上述字符串输入,是以单词为单位,这种情况并不友好,所以需要选取一行输入,在istream中提供了一些面向行的函数:
getline()、get()
其中:getline()丢弃换行符,而get()保留换行符,但都是遇到换行符才会停止读取。
getline()语法:cin.getline(array,size)
其中array为字符串数组,size为数组长度,虽然getline()不保留换行符,但是
会使用空字符来替换换行符
。
getl()语法:cin.getl(array,size)
因为get()保留换行符,所以在输入时,若两个get()连在一起,会导致第二个get()读取第一个get()的换行符,造成直接退出的假象。因此在使用时,两个get()之间需要使用一种方法读取换行符。例如:
cin.get(array1,size);
cin.get(); //读取换行符
cin.get(array2,size);
或者
cin.get(array1,size).get();
这是因为cin.get(array1,size)返回的是一个cin对象,将继续调用get()函数。
此外两个函数里面均带了size,表示两个函数一直读取输入,
直到到达了行尾或读取了size-1个字符停止
6、string类
使用string类之前,需要先包含头文件:
include<string>
string对象和字符数组之间的主要区别是,可以将string 对象声明为简单变量,即创建的是string对象,它可以自动处理字符串的大小。
使用string类,可以实现赋值操作、拼接和附加操作:
string str1 = "abcd";
string str2 = "efgh";
string str3,str4;
str3 = str2;
str4 = str1 + str2;
获取string对象长度方法:
1、str.size();
2、str.length()
7、string类的输入
7.1、
未定的string对象大小:自动初始化为0
7.2、
string对象的输入方法:
string str;
1、cin >> str; //单词输入
2、getline(cin,str); //行输入,丢弃换行符
8、cin输入和cout输出:单个字符
C语言形式:
ch = getchar()和putchar(ch);
C++形式:
cin.get(ch)和cout.put(ch)
9、cin输入和cout输出:字符串
9.1、cin输入字符串
int main()
{
using namespace std;
char ch;
int count = 0; // use basic input
cout << "Enter characters; enter # to quit:\n";
cin >> ch; // get a character
while (ch != '#') // test the character
{
cout << ch; // echo the character
++count; // count the character
cin >> ch; // get the next character
}
cout << endl << count << " characters read\n";
return 0;
}
输入实例:see ken run#really fast
输出实例:seekenrun
这是因为读取char值时,cin将忽略空格和换行符,因此没有回显;
如果想要回显每个字符,将全部字符计算在内的话,可以使用
cin.get(ch)
函数;该函数读取每个字符,即使是空格
9.2、cout输出字符串
int main()
{
using namespace std;
int a = 10;
int *ptr = &a;
char name[20] = "xiaofang";
char *pstr = name;
cout << ptr << endl;
cout << pstr << endl;
return 0;
}
给cout提供一个指针,将打印地址,但是如果指针类型为char*,则cout将显示指向的字符串。
10、while循环和字符串
字符串的空字符可以当中while循环停止的标志:即while循环在遇到空字符就会停止
char name[] = "xiao fang";
int i = 0;
while(name[i] != '\0') or while(name[i])
{
cout << name[i] << ' ';
i++;
}
但不同于C风格字符串,string不使用空字符来标记字符串末尾;
11、字符串指针数组
首先简单了解一下数组指针和指针数组
11.1、指针数组和数组指针
/*1、指针数组:存放指针的数组*/
int *ptr[5]; //“[]”的优先级要比“*”要高,表示数组包含5个指向int类型数据的指针
/*2、数组指针:指向数组的指针*/
int (*ptr2)[5]; //“()”的优先级比“[]”要高,表示指向一个包含5个int类型数据的数组的指针
11.2、字符串指针数组
由上述分析可知,字符串指针数组:数组包含指向字符串类型的指针
const char * cities[5] = // array of pointers,字符串常量使用const修饰
{
"Gribble City",
"Gribbletown",
"New Gribble",
"San Gribble",
"Gribble Vista"
};
for (int city = 0; city < 5; ++city)
{
cout << cities[city] << ":\t";
}
也可以使用string对象数组代替:
const string cities[5] = // array of pointers,字符串常量使用const修饰
{
"Gribble City",
"Gribbletown",
"New Gribble",
"San Gribble",
"Gribble Vista"
};