天天看点

黑马程序员—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));  //输出,表示所占用内存大小,系统添加的'\0'也会被计算入内
    printf("sizeof(name1)=%zd\n",sizeof(name1));//输出,输出的是指针类型的大小

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

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

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


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

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

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

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

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

    if ( =='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[]);
    printf("m[5]%c\n\n",m[]);

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

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

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

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

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

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

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

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

}
           

程序运行结果如下:

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