java基础改学C++(五)数组(2)字符串

// 字符数组与字符串

 

//导入

#include <string.h> 

#include <iostream>

using namespace std;

 

int main(){

//   1 声明与初始化

    

    

    注意区分:'\0' 这个字符,转为 int,就是 0,ASCII 码值是 0;'0' 这个字符,char,转为 int,是 48, ASCII 码值是 48。

 

//2  C++将字符串作为字符数组来处理。字符串常量:“CHINA”,被处理成一个字符类型的一维数组:

    

        

// C/C++ 中,字符串本质是一个字符数组,那么既然是数组,我怎么知道长度啊?于是约定,对于字符串,它的字符数组中,‘\0’ 代表字符串的结束标志,它占内存空间,但不计入字符串的长度。有了结束标志‘\0’后,我们只依据它判断字符串是否结束、计算长度!请仔细看下图:

    

    char c[] ="dasdeas",f[] = {"wcao!"}; // c 是一个长度为 8 的字符数组,f 是长度为 6 的字符数组。但是如果问字符串的长度,那就不算 '\0'。但是在内存中,必须存 '\0'。注意:可以加大括号,可以不加。

    char d[][8] = {"ddaw","dsrd1wa"}; // 因为字符串最后都是 '\0',所以声明 8,如果想存字符串,只能存最长7。如果真存了一个很长的字符串,那就覆盖了别的区域的内存导致程序错误呗。

    char c[10] = "CHINA"//内存里是这样的!!!

    

    

    // 可以自己写  ‘\0’ ,效果一样:

    char g[] ="Test\0";

    char h[] = {'a','b','c','\0'};

 

    char str2[12]="The String";

    // 或者用 cin

    cin>>str2; // 和 java 输入一样,遇到空格之后是下一个变量的内容了,所以想输入整行的话,改为

    cin.getline(str2, 11); // 让键盘收11个!!!

 

以上详细的介绍了字符数组与字符串,这里再提一下 char *

对于:

char str3[] = "321";

这么简单的一句,到底本质是什么呢?(下面的解释看看即可,不要求理解)

字符串 “321” 在编译后,是编排在代码段中的,地址设为 A。是只读的。现在我在栈上获取4字节内存,起始地址在B,然后把A地址上的字符串复制到B处,B在栈中,我是可以修改B的内容的,B 就是 str3。

我们前面的文章灌输了一种数组名就是地址、指针的观点,考虑:

const char * str3 = "321"; 

和上面的有什么不同呢?字符串是 A,那么 str3 就是 A!如果我现在尝试修改 str3[0] = 0; 肯定是内存访问异常,段错误。

总是超前说指针的内容,也没办法,必须灌输这个概念,不理解的话,慢慢理解,都是这么过来的。

const char * str4 = "321";    // str3 和 str4 地址相同,常量字符串只会编译为1份。

char str5[] = "321"; // str5 和谁的地址都不一样,他是申请栈内存然后把字符串复制过去的

指针有关后面的文章再说。

也可以先去看看后面指针的文章再回顾本文。

 

// java 里 String 类的方法多,C++ 也有不少,但是使用方法你可能感到很奇怪。所有字符串处理函数,参都都是,字符数组名,即指针,char* 或 const char *

//    3.1 拼接到第一个参数上:单词 concatenate

    char str1[20] = {"123+"};

    char str3[5] = {"321"};

    strcat(str1, str2);  //无返回值

//    注意:

    (下面演示的是static char,不用管 重点看函数的使用)

    

下面这些函数吧,必须练10来遍用起来才能顺手。。。

//    3.2  复制

    strcpy(str1, str3);

//    记住:被修改的是第一个参数

    strncpy(str1,"eqwedwrdws",5);//限制copy几位。

  

//    3.3  比较 返回值:第一个出现不同字符的ASCII码差值左减右 .完全相同为0

    int distance =strcmp(str1, str2);

    cout<<distance<<endl;

//    3.3.2   限制比较时最多后延几位

    distance = strncmp(str1, str2,5);//刚才的复制还有别的方法也都有相似的方法,不写了

    

//    3.4   字符串长度。。。。注意是按照字符串的规则算长度

    cout<<strlen(str1)<<endl;

//    注意。长度不包括 '\0',遇到这个字符就计算完成:

    char strr[20] ="wocao\0 easf\0s";

    cout<<strlen(strr)<<endl;//输出5

    

//  3.5 转换大小写字母(java: toLowerCase(),toUpperCase())草太多了好烦 学java的自己猜吧不写了

    

// 4   下面,java 最熟悉的 string 类来了,对字符数组的封装而已。

   

    string a32 ="dssrws";

    string a342;

    a342 = a32;

   // 比较可以直接用 > < ==,按字母排序

   

    // 可以通过下标修改字符串内容

    //1.

    a342[5] ='w';

    //2.

    a32 = strr;

    cout<<a32<<endl;

    //3.

    a32 = "123456789\00";

    cout<<a32<<endl;//也是遇 \0

 

   注意:C++ 的 string 操作有限,功能大多是通过 str 族的函数实现的,这要求使用者对这个库的函数非常熟练使用。
}

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值