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


}

 

posted @ 2013-03-17 21:26  cart55free99  阅读(285)  评论(0编辑  收藏  举报