C++ 指针 数组 字符串

  • 字符串变量的定义和引用

  1. 头文件#include<string>
  2. 字符串会自动在末尾加上结束符‘/0’
  3. 既可以用字符串常量给字符串变量赋值,也可以用一个字符串变量给另一个字符串变量赋值。
  4. 可以对字符串变量中某一字符进行操作,string word=″Then″;word[2]=′a′;
  5. 可以在输入输出语句中用字符串变量名,输入输出字符串
    cin>> string1; //从键盘输入一个字符串给字符串变量string1
    cout<< string2; //将字符串string2输出
  • 字符串变量的运算

  1. 字符串复制用赋值号
    string1=string2;
    其作用与“strcpy(string1,string2);”相同。
  2. 字符串连接用加号
    string string1=″C++″; //定义string1并赋初值
    string string2=″Language″;//定义string2并赋初值
    string1=string1 + string2;//连接string1和string2。连接后string1为″C++ Language″。
  3. 字符串比较直接用关系运算符
    可以直接用 ==(等于)、>(大于)、<(小于)、!=(不等于)、>=(大于或等于)、<=(小于或等于)等关系运算符来进行字符串的比较。
  4. 字符串连接strcat
    strcat(char[],const char[]);//该函数有两个字符数组的参数,函数的作用是:
                                //将第二个字符数组中的字符串连接到前面字符数组的字符串的后面。
  5. 字符串复制函数strcpy
    strcpy(char[],const char[]);//它的作用是将第二个字符数组中的字符串复制到第一个字符数组中去
                                //将第一个字符数组中的相应字符覆盖。
    /*
    
    1.在调用strcpy函数时,第一个参数必须是数组名(如str1),第二个参数可以是字符数组名,也可以是一个字符串常量。
    
    2.可以用strcpy函数将一个字符串中前若干个字符复制到字符数组中去。
    
    3.只能通过调用strcpy函数来实现将一个字符串赋给一个字符数组,而不能用赋值语句将一个字符串常量或字符数组直接赋给一个字符数组。
    
    */

    只能通过调用strcpy函数来实现一个字符串赋给一个字符数组,而不能用赋值语句直接将字符串常量或者字符数组赋给一个字符数组。

  6. 字符串比较strcmp
    strcmp(const char[],const char[]);//作用是比较两个字符串。
                                      //由于这两个字符数组只参加比较而不应改变其内容,
                                      //因此两个参数都加上const声明
    /*
    1.如果字符串1=字符串2,函数值为0。
    2.如果字符串1>字符串2,函数值为一正整数。
    3.如果字符串1<字符串2,函数值为一负整数。
    */

    注意:对两个字符串比较,不能用以下形式:
    if(str1>str2) cout<<″yes″;
    字符数组名str1和str2代表数组地址,上面写法表示将两个数组地址进行比较,而不是对数组中的字符串进行比较。

  7. 字符串长度strlen
    strlen(const char[]);//它是测试字符串长度的函数。其函数的值为字符串中的实际长度,不包括′\0′在内。

    得到的是实际长度,不包括‘/0’在内

  8. 字符转换  #include <stdlib.h> http://www.cnblogs.com/processakai/archive/2011/06/24/2089348.html

atof(将字符串转换成浮点型数)
atoi(将字符串转换成整型数)

atol(将字符串转换成长整型数)
strtod(将字符串转换成浮点数)
strtol(将字符串转换成长整型数)
strtoul(将字符串转换成无符号长整型数)
toascii(将整型数转换成合法的ASCII 码字符)
toupper(将小写字母转换成大写字母)
tolower(将大写字母转换成小写字母)

 int atoi(const char *nptr);
函数说明 atoi()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束符('\0')才结束转换,并将结果返回。
附加说明 atoi()与使用strtol(nptr,(char**)NULL,10);结果相同。
 

     #include<stdlib.h>
     mian()
     {
     char a[]=”-100”;
     char b[]=”456”;
     int c;
     c=atoi(a)+atoi(b);
     printf(c=%d\n”,c);
     }
  执行 c=356
  •  字符串变量长度

length() size()

#include <string>
string s = "hello world";//本质是string类,没有‘/0’,包含成员函数length()
int len = s.lenght();//得到真实长度11
cout<<len<<endl;
  •  字符串变量输入输出

string类重载了输入输出的运算符,用”>>”进行输入,用”<<”进行输出

输入的运算符“>>”默认会忽略空格,遇到空格就认为输入结束


  • 字符串数组

  1. 在一个字符串数组中包含若干个(现为5个)元素,每个元素相当于一个字符串变量。
  2. 并不要求每个字符串元素具有相同的长度,即使对同一个元素而言,它的长度也是可以变化的,当向某一个元素重新赋值,其长度就可能发生变化。
  3. 在字符串数组的每一个元素中存放一个字符串,而不是一个字符,这是字符串数组与字符数组的区别。如果用字符数组存放字符串,一个元素只能存放一个字符,用一个一维字符数组存放一个字符串。
  • 获取字符串/字符串数组长度

  1. 1 sizeof()
  • 求所占总空间的字节数,静态的,跟初始状态字符数组的大小有关系,大小等于初始时字符数组的大小或者等于初始时字符数组的大小+1 
  • 在C++中,如果定义的是字符串数组的话,那么如果想获取数组的长度,只能用sizeof(数组名),而不能用strlen(str)
  • sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组、指针、类型、对象、函数等。
    它的功能是:获得保证能容纳实现所建立的最大对象的字节大小。
    由于在编译时计算,因此sizeof不能用来返回动态分配的内存空间的大小。实际上,用sizeof来返回类型以及静态分配的对象、结构或数组所占的空间,返回值跟对象、结构、数组所存储的内容没有关系。
    具体而言,当参数分别如下时,sizeof返回的值表示的含义如下:
    数组——编译时分配的数组空间大小;
    指针——存储该指针所用的空间大小(存储该指针的地址的长度,是长整型,应该为4);
    类型——该类型所占的空间大小;
    对象——对象的实际占用空间大小;
    函数——函数的返回类型所占的空间大小。函数的返回类型不能是void。
    char str[20]="0123456789"; 
    int   a=strlen(str); //a=10;strlen 计算字符串的长度,以\0'为字符串结束标记。 
    int   b=sizeof(str); //b=20;sizeof 计算的则是分配的数组str[20] 所占的内存空间的大小,
                         //不受里面存储的内容影响
    
    char *str1="absde";
    char str2[]="absde";
    char str3[8]={'a',};
    char ss[] = "0123456789";
    
    输出:
    
    sizeof(str1)=4;
    sizeof(str2)=6;
    sizeof(str3)=8;
    sizeof(ss)=11
    
    str1是一个指针,只是指向了字符串”absde”而已。所以sizeof(str1)不是字符串占的空间也不是字符数组占的空间,而是一个字符型指针占的空间。所以sizeof(str1)=sizeof(char*)=4,在C/C++中一个指针占4个字节
    
    str2是一个字符型数组。C/C++规定,对于一个数组,返回这个数组占的总空间,所以sizeof(str2)取得的是字符串”absde”占的总空间。”absde”中,共有a b s d e \0六个字符,所以str2数组的长度是6,所以sizeof(str2)=6*sizeof(char)=6
    
    str3已经定义成了长度是8的数组,所以sizeof(str3)为8
    
    str4和str2类似,’0’ ‘1’ … ‘9’加上’\0’共11个字符,所以ss占的空间是11
    
    总之,对于指针,sizeof操作符返回这个指针占的空间,一般是4个字节;而对于一个数组,sizeof返回这个数组所有元素占的总空间。char*与char[]容易混淆,一定要分清,而且char*=”aaa”的写法现在不被提倡,应予以避免
  • 对于指针,sizeof操作符返回这个指针占的空间,一般是4个字节;

  • 而对于一个数组,sizeof返回这个数组所有元素占的总空间。

  • strlen不区分是数组还是指针

  1. 2 strlen()
  • trlen()是函数,要在运行时才能计算。
  • 参数必须是字符型指针(char*),所以不能把字符串变量名作为参数。当数组名作为参数传入时,实际上数组就退化成指针了。
/*strlen()*/
string 函数求是字符串的实际长度,它可以用来获取动态实际字符数组的长度,到第一个“\0”的长度,且不将‘\0’计算在内。
  • 对比
              char arr[10] = "What?";
              int len_one = strlen(arr);
              int len_two = sizeof(arr); 
              cout << len_one << " and " << len_two << endl; 
    输出结果为:5 and 10
    点评:sizeof返回定义arr数组时,编译器为其分配的数组空间大小,不关心里面存了多少数据。
    strlen只关心存储的数据内容,不关心空间的大小和类型。
    
              char * parr = new char[10];
              int len_one = strlen(parr);
              int len_two = sizeof(parr);
              int len_three = sizeof(*parr);
              cout << len_one << " and " << len_two << " and " << len_three << endl;
    输出结果:23 and 4 and 1
    点评:
    第一个输出结果23实际上每次运行可能不一样,这取决于parr里面存了什么(从parr[0]开始知道遇到第一个NULL结束);
    第二个结果实际上本意是想计算parr所指向的动态内存空间的大小,但是事与愿违,sizeof认为parr是个字符指针,因此返回的是该指针所占的空间(指针的存储用的是长整型,所以为4);
    第三个结果,由于*parr所代表的是parr所指的地址空间存放的字符,所以长度为1。
     
  1. 3 str.length()和str.size()是用于求string类对象的成员函数 

  • 字符串及字符数组要点

  1. sizeof是算符,strlen是函数。
  2. sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以”\0”结尾的。
  3. 数组做sizeof的参数不退化,传递给strlen就退化为指针了。
  4. strlen的结果要在运行的时候才能计算出来,时用来计算字符串的长度,不是类型占内存的大小。
  5. 数组在声明时如果不进行初始化,一定要指明大小

 


  • 参考博文

https://blog.csdn.net/Xiao_Yanci/article/details/79111186

https://blog.csdn.net/m0_37592397/article/details/79701992

猜你喜欢

转载自blog.csdn.net/lixiaoguai2017/article/details/85016709