C 字符串数组
#include <stdio.h> #include <stdlib.h> #define DG "%d\n" //字符串数组 int main() { //长度问题============================ char arr[]= {"123"}; //定义的是一个字符串 char arr1[]= {'1','2','3'}; //一个字符数组 //两者其实是有区别的 //第一个相当于char arr[]={'1','2','3','\0'}; printf(DG,strlen(arr));//得到3//strlen是计算字串中字符的个数 printf(DG,sizeof(arr));//得到4 printf(DG,sizeof(arr1));//得到3 //关于strlen=========================== //从0号元素开始一直往后直到遇到第一个\0为止 char arr2[]= {'1','2','3','\0','1','2','3'}; printf(DG,strlen(arr2));//结果是3//虽然这里实际上有6个字符 但是只统计到前3个 //对于二维数组也是如此 char arr3[2][3]= {'1','2','3','\0','1','2'}; printf(DG,strlen(arr2));//结果是3 //定义与初始化问题=============================== char arr4[4];//ok //char arr4[];//wrong char arr5[2][3]; //char arr5[][3];//wrong//定义数组时如果没有初始化 必须指明数组的大小 char arr6[]= {"tyu"}; char arr7[][2][3]= {"123456qwert"}; //只有定义同时又初始化了 才能省去第一个[] //对于arr7 为什么第一个[]可以省去呢? //其实系统知道要对arr7如何分配空间 //123456qwert有11个字符 那么有12个空间(最后一个是\0) //[][2][3]表明一个大组中有两个组 一个组中又有3个人 //这样计算下来就是有2个大组 所以第一维的数据时可以确定的 char arr8[4]= {'2','3'}; //定义一个size为4的数组//并对前两个元素初始化2和3 printf(DG,arr8[3]);//未手动初始化的部分为0 char arr9[4]; printf(DG,arr9[3]);//这里输出0//char数组有默认值0//因为char本身默认为0 即便是在函数内 char ch; printf(DG,ch);//输出0 //int 数组和int本身一样 函数中的int和int数组是不具备默认值的 int num[6]; printf(DG,num[3]);//随机数 //strcpy和strcat问题=========================== char *t="123";//像这样定义的是字符指针同时又用=初始化的 存储123的这块区域是只读的 char *str="qwejj"; //strcpy(t,str);//会报XXXX内存只读的错误 //strcpy是重写字串1的空间内容 使这里的字符等同于字串2的字符 //strcpy中有这么一句while ((*strDest++=*strSrc++)!='\0'); //但是这样就ok char *t2; t2=(char *)malloc(50*sizeof(char)); strcpy(t2,"dfg");//ok //如果觉得malloc语句很麻烦 char t3[20]; strcpy(t3,str); char t4[]="dfghrthrt"; strcpy(t4,str); printf(t4);//qwejj //假如要被修改的空间定义的大小不够? char t5[]="kl"; strcpy(t5,str); printf(t5);//qwejj//正确输出 //strcat(t,str);//对于strcat也是如此// *t="123"; 这种定义属于常量 //同样报 内存只读的错误 strcat(t2,str); strcat(t3,str); strcat(t4,str);//ok //gets puts================================ char *st; st=(char *)malloc(50*sizeof(char)); gets(st);//gets(char *)//所以gets括号中可以使数组名也可以是指针名 //使用指针名前要记得分配空间 puts(st);//输出完一句话后会自动换行 char a[20]; gets(a);//在遇到回车符号结束本次输入//接收到的字符并不包括回车 printf(a); puts(a); char *st2; st2=(char *)malloc(50*sizeof(char)); scanf("%s",st2); printf(st2);//ok char st3[20]; scanf("%s",st3); puts(st3);//ok }