// 字符数组与字符串
//导入
#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] = {"dd啊aw","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 族的函数实现的,这要求使用者对这个库的函数非常熟练使用。
}