黑马程序员—C学习笔记—补充字符串总结(定义、赋值、sizeof、strlen)

———–Java培训、Android培训、IOS培训、.Net培训、期待与您交流!————

本节是个人学习过程中的笔记,供初学者一起学习,欢迎大家批评指正,留言参与讨论,谢谢。
前面有两节已经写到字符串了,今天做一个补充总结(定义、赋值、sizeof、strlen)。

  1. 字符串可以由两种方式来定义,字符数组和字符指针。
  2. 定义的同时可以由两种方式来赋值,一个是{‘a’,’b’,…}字符数组元素的形式,另外一种是字符串形式”ab…”。
  3. 数组定义的字符串,除了数组名是一个类似指针的常量不可改变外,其他元素都可以单独访问改变。
  4. 指针定义的字符串,只能通过字符串形式”ab…”来赋值。而且字符串为常量,定义字符串的那个指针是可以指向其他地方的。
  5. 用字符串形式”ab…”来赋值实现的字符串,无论是什么定义方式,也不论”“中是否已经存在’\0’,系统都会在字符串末尾加上一个’\0’。
  6. sizeof()函数,在碰到指针变量时都会返回8即指针大小(64位编译器),其他情况则计算该字符串所占内存字节数(把字符串里面自带的’\0’或者系统添加的’\0’,都计算在内)。
  7. strlen()函数,原理就是不断匹配,不管是字符串内部自带的’\0’或者系统末尾添加的’\0’,只要碰到第一个’\0’,函数就会返回,正常情况下都返回字符串有效元素个数(不包括’\0’)。

详细变化请参考代码,谢谢。

#include <stdio.h>
#include <string.h>

int main()
{
    char name[]="Jack";
    char n1[]="test0 okla";
    char* name1="Jack";
    char* n2="test0 okla";

    printf("sizeof(name)=%zd\n",sizeof(name));  //输出5,表示所占用内存大小,系统添加的'\0'也会被计算入内
    printf("sizeof(name1)=%zd\n",sizeof(name1));//输出8,输出的是指针类型的大小

    printf("sizeof(n1)=%zd\n",sizeof(n1));

    printf("sizeof(n2)=%zd\n",sizeof(n2));

    //此处计算指针字符数组n2所占内存空间,是sizeof()不能求出来的部分。两种方法实现如下
    //方法1,自己去遍历求出大小,包含最后默认添加的'\0'
    int possess = 1;
    while(*(n2+possess-1))
    {
        //n2++;
        possess++;
    }
    printf("possess of n2=%d\n",possess);
    //方法2,利用strlen函数,其实这个函数也就干咯上面代码的事情。其中+1就是计算'\0'入内
    printf("strlen(n2)+1=%d\n",strlen(n2)+1);
    printf("%s\n",n2);


    printf("strlen(n1)=%zd\n",strlen(n1));

    printf("strlen(n2)=%zd\n",strlen(n2));

    for (int j=0; j<6; j++) {
        printf("name1[%d]=%c\n",j,*(name1+j));
    }

    if (*(name1+4)==0) {
        printf("name1[4]==0\n");
    }
    if (*(name1+4)=='\0') {
        printf("name1[4]为'\\0'\n");
    }
//    if (*(name1+4)==NULL) {
//        printf("name1[4]为''\n");
//    }

    if (0 =='\0') {
        printf("0 =='\\0'\n");
    }

    if (0 =='0') {
        printf("0 =='0'\n");
    }

    void anotherTest();
    anotherTest();
}

void anotherTest()
{
    //瞧瞧下面字符串,末尾是啥?系统是否自动添加'\0'
    char m[]="Jack";
    char* m1="Jack";
    char* m2="Jack";
    char* m3="Jack\0";
    char m4[]="Jack\0";     //结果显示,不管左边如何,只要右边是字符串形式,即使最后有'\0',系统还是会当做正常字符处理,在其末尾加上'\0'
    char m5[]={'J','a','c','k'};
    char m6[]={'J','a','c','k','\0'};
    char m7[]={'J','a','\0','k','\0'};
    char m8[]={'J','a','\0','c','k'};//结果显示,系统只当他们是数组,不会末尾添加操作

    //以下写法,其实都数组或者字符串访问越界咯,C只提供警告,所以以后还得手动确定好边界。
    printf("m[4]%c\n",m[4]);
    printf("m[5]%c\n\n",m[5]);

    printf("m1[4]%c\n",m1[4]);
    printf("m1[5]%c\n\n",m1[5]);

    printf("m3[3]%c\n",m3[3]);
    printf("m3[4]%c\n",m3[4]);
    printf("m3[5]%c\n",m3[5]);
    printf("m3[6]%c\n\n",m3[6]);

    printf("m4[3]%c\n",m4[3]);
    printf("m4[4]%c\n",m4[4]);
    printf("m4[5]%c\n",m4[5]);
    printf("m4[6]%c\n\n",m4[6]);

    printf("m5[4]%c\n",m5[4]);
    printf("m5[5]%c\n\n",m5[5]);

    printf("m6[4]%c\n",m6[4]);
    printf("m6[5]%c\n\n",m6[5]);

    printf("m7[4]%c\n",m7[4]);
    printf("m7[5]%c\n\n",m7[5]);

    printf("m8[4]%c\n",m8[4]);
    printf("m8[5]%c\n\n",m8[5]);

    //测试下sizeof函数
    int intArray[] = {1,2};
    double doubleArray[]={1,2};
    printf("sizeof(intArray)=%zd\n",sizeof(intArray));//8
    printf("sizeof(doubleArray)=%zd\n",sizeof(doubleArray));//16 返回空间
    //此时木有strlen()函数可用,可以使用int length=sizeof(intArray)/sizeof(int);来求元素个数

}

程序运行结果如下:
这里写图片描述这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值