字符串初步

字符串在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’)。

其他操作,与上面相同。


 

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值