字符串在Qbasic中,是一种类型。而在C++里面,则一般不用这种类型来完成字符串的操作,而是通过字符数组来完成字符串的操作(C++里面的string类型处理速度较慢)。
字符类型我们以前就已经学习过了,是char类型。而字符数组就是类似这样定义的数组:char s[100]。
通过这样的定义,我们就可以通过
cin >> s
来得到,输入的字符串。特别需要注意的是,字符串的输入,是以所有非可视字符为结束的。也是就是说,如果输入的一行字符串是:I am a student,使用cin >> s;后,则s里面存储的只有“I”。如何得到带空格的字符串,后面将会介绍。
一、字符串的基本操作
(1)字符数组名的本质(数组名的本质)
数组的名字到底代表什么?数组的名字,实际上代表的是这个数组在内存中连续存储的起始位置。而数组的下标即为离数组起始位置的偏移量。
在char s[100]中,s是字符数组的数组名。这个名字就代表在内存中的起始位置。100代表,定义了100个连续的空间,用来存储字符。
(2)字符数组的初始化
在给数组赋初值的时候,可以通过定义时,
char s[100]={“1231231312”};
来给字符数组赋初始值。但是,不能在程序中。
如: s = “123131”;
是不被允许的。
当然,我们也可以通过 cin >> s;给字符数组s输入初始值,它代表,在s开始的空间连续的存储输入的字符。
(3)字符数组的结束
这是字符数组中,最最重要的知识点!在内存中字符数组连续的进行存储,但是,并不是所有定义了的空间都一定会用来存储内容。没有输入那么多内容时,后面的空间存储的是内存空间中的随机内容。所以,字符数组在内存中存储时,就必须有一个固定的符号来当成结束符。所以,在C/C++中就定义了’\0’来当成字符串的结果。也就是说,在每个我们输入的字符串后,C++还会自动在你输入的字符串后加上一个符号’\0’。所以,当我们需要存储100个字符时,一定要定义101个空间,用来存储最后一个结束字符’\0’。
注意一点,在写\0时,我们加上的是单引号。强调一点,在C++中,字符串需要用双引号来表示,而对于一个符号,则必须用单引号来表示。
(4)字符数组的操作
既然说是字符数组,则字符数组就有完全的数组性质,对于数组中的每一个符号,都可以单独用下标来访问和操作。如:
char s[100];
s[0]=’a’; s[1]=’b’; s[2]=’a’;
s[3]=’\0’;
这样在输出:cout << s;的时候才能够输出aba。
(5)字符数组的实际长度
在输入字符数组后,想要知道到底输入了多长的字符。我们可以用最简单的办法,strlen函数来得到长度。但是,这个长度是如何做到的呢?这就要看结束的符号了。找到’\0’的位置就找到了字符数组实际上存储的字符长度。
char s[100];
cin >> s;
int i=0;
while (s[i]!=’\0’) i++;
cout << i << endl;
这样就得到了字符的长度。
(6)字符数组的复制
经过前面的内容,我们应该很容易理解:
char s1[100],s2[100];
cin >> s1;
s2 = s1;
是不能够被允许的。因为s1和s2是两个不同的地址,用s2的地址来覆盖s1的地址,是不能够被接受的,所以不行。那么,我们如何来对付这样的问题呢?与前面的操作相似。同样是要把’\0’前的所有符号,赋值到s2的对应的位置里,但是,务必要注意后面的’\0’。
char s1[100],s2[100];
int i=0;
cin >> s1;
while (s1[i]!=’\0’)
{
s2[i]=s1[i];
i++;
}
s2[i]=’\0’;
最后一条是不可缺少的。因为,只有这样,s2中,才有了标志字符串结束的符号。
当然也可以,使用字符串复制函数strcpy来操作,例如:
strcpy(s2,s1);
就是将S1的内容复制到S2里。
(7)字符串的连接
我们可能还需要将一个字符串连接到另外一个字符串后面。这样就要同样做如下的操作。
#include <cstdlib>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
char s1[100],s2[100];
int i;
int l1 , l2;
cin >> s1 >> s2;
l1 = strlen(s1);
l2 = strlen(s2);
for ( i = 0 ; i < l2 ; i++ )
s1[l1 + i] = s2[i];
s1[l1 + i] = '\0';
cout << s1 << endl;
system("PAUSE");
return EXIT_SUCCESS;
}
当然也可以用字符串操作函数strcat(s1 , s2)。
(8)两个字符串的比较
对于两个字符串,经常需要对字符串进行比较。第一个大于第二个,则输出1;第一个小于第二个输出-1;两个相等输出0。
#include <cstdlib>
#include <iostream>
#include <cstring>
using namespace std;
int main(int argc, char *argv[])
{
char s[2000];
char a[1000];
int l, i;
cin >> s >> a;
l = strlen(s);
for (i = 0 ; i <= l ; i++)
if (s[i] != a[i])
break;
if ( i == l + 1)
cout << 0 << endl;
else
if (s[i] > a[i])
cout << 1 << endl;
else
cout << -1 << endl;
system("PAUSE");
return EXIT_SUCCESS;
}
当然,以上内容可以用字符串比较函数strcmp来完成,例如:
n = strcmp(s1 , s2);
(9)带空格的输入
如果输入的内容中带有空格,则不能用简单的cin来完成这样的功能。就需要使用cin.getline来完成这个功能,如:
char s[100];
cin.getline(s , 80);
代表,以回车为结束,最多存储79个字符(第80个存储的是’\0’)。
其他操作,与上面相同。