精华内容
下载资源
问答
  • C语言中字符串初始化

    千次阅读 2021-03-19 14:27:23
    所以,字符串有两种表示方法,分别是字符数组和字符指针,而这两种表示的初始化却又不尽相同。 为了方便比较结果,定义全局变量LENGTH为15,定义输出函数print如下: /** Display the outputs. * args: chars[], T

    字符串是最常用的数据类型之一。

    C语言中,是没有String类型来存储字符串的,字符串被看做是一组连续char类型。

    所以,字符串有两种表示方法,分别是字符数组字符指针,而这两种表示的初始化却又不尽相同。

    为了方便比较结果,定义全局变量LENGTH15,定义输出函数print如下:

    /** Display the outputs.
     * args: chars[], The char array to print.
     *       length, The size of the char array you wanna print.
     *       type, Tht format you wanna print those chars.
     *              16: hexadecimal
     *               0: chars
     */
    void print(char* chars, int length, int type){
        // printf("%ld:", sizeof(chars));
        if (type == 16)
        {
            for (int i = 0; i < length; i++)
            {   
                printf("0x%x ", *(chars + i));
            }
        } else if (type == 0)
        {
            for (int i = 0; i < length; i++)
            {   
                printf("%c", *(chars + i));
            }
        }
        
        printf("\n");
    }
    

    其中type0时直接输出字符串,为16时,以16进制输出。

    字符数组

    以字符串赋值

    char array_1[LENGTH] = "array_1";
    print(array_1, LENGTH, 16);
    printf("%ld\n", sizeof(array_1));
    

    先来看结果

    0x61 0x72 0x72 0x61 0x79 0x5f 0x31 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 
    15
    

    这种情况下,字符串以0结尾,并且没有赋值的部分,也都已经初始化为char类型的0

    strcpy赋值

    char array_2[LENGTH];
    strcpy(array_2, "array_2");
    print(array_2, LENGTH, 16);
    printf("%ld\n", sizeof(array_1));
    

    结果为

    0x61 0x72 0x72 0x61 0x79 0x5f 0x32 0x0 0xfffffff0 0x6c 0x7f 0x0 0x0 0xffffffc0 0xfffffff3
    15
    

    可见,使用strcpy函数赋值,字符串到\0结束,之后的数据,类型都是随机的。

    和方法一对比可知,字符数组在声明时,是没有初始化为全零的。

    以字符数组赋值

    在C语言中,一个字符串结束的标志位是\0, 那么在用于初始化的字符数组最后一位要不要写\0呢?

    不加\0的情况:

    char array_3[LENGTH] = {'a', 'r', 'r', 'a', 'y', '_', '3'};
    print(array_3, LENGTH, 16);
    printf("%ld\n", sizeof(array_1));
    

    结果为

    0x61 0x72 0x72 0x61 0x79 0x5f 0x33 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0
    15
    

    \0的情况

    char array_4[LENGTH] = {'a', 'r', 'r', 'a', 'y', '_', '4', '\0'};
    print(array_4, LENGTH, 16);
    printf("%ld\n", sizeof(array_1));
    

    结果为

    0x61 0x72 0x72 0x61 0x79 0x5f 0x34 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0
    15
    

    可见,这两种方法并没有什么区别。直接赋值时,数组会按声明的长度,把每个位置都初始化为\0

    值得一提

    • 声明为数组的变量,是不能先申明,再用常量赋值的。以下两种写法都不能通过编译
    char array_5[LENGTH];
    array_5 = "test";
    array_5 = {'t', 'e', 's', 't'};
    
    • 另外,用sizeof实际上是求的指针变量的大小,也就是数组声明的长度。但是用strlen函数可以求出字符串的有效长度,也就是到\0的长度,可自行验证

    字符指针

    在将变量声明为指针时,只有两种赋值方法。

    以字符串直接赋值

    char* pointer_1 = "pointer_1";
    print(pointer_1, LENGTH, 16);
    printf("%ld\n", sizeof(pointer_1));
    

    结果为

    0x70 0x6f 0x69 0x6e 0x74 0x65 0x72 0x5f 0x31 0x0 0x70 0x6f 0x69 0x6e 0x74
    8
    

    值得注意的是,此时,sizeof便可求出字符串的有效长度了。

    以字符串间接赋值

    char* pointer_5;
    pointer_5 = "pointer_5";
    print(pointer_5, LENGTH, 16);
    printf("%ld\n", sizeof(pointer_1));
    

    结果为

    0x70 0x6f 0x69 0x6e 0x74 0x65 0x72 0x5f 0x35 0x0 0x0 0x1 0x1b 0x3 0x3b
    8
    

    其他方法

    • 在使用**strcpy函数赋值**时,编译器会提示指针变量未初始化。

      可见以数组声明时,虽然数组中的值没有初始化为0,但是地址空间已经得到了。

      而用指针声明时,没有指明长度,自然没办法申请空间。

    • 至于用字符数组赋值的方法,由于现在变量是声明为字符指针的,类型不同,自然是行不通的。

    完整测试代码

    #include<stdlib.h>
    #include<string.h>
    #include<stdio.h>
    
    #define LENGTH 15
    
    
    /** Display the outputs.
     * args: chars[], The char array to print.
     *       length, The size of the char array you wanna print.
     *       type, Tht format you wanna print those chars.
     *              16: hexadecimal
     *               0: chars
     */
    void print(char* chars, int length, int type){
        // printf("%ld:", sizeof(chars));
        if (type == 16)
        {
            for (int i = 0; i < length; i++)
            {   
                printf("0x%x ", *(chars + i));
            }
        } else if (type == 0)
        {
            for (int i = 0; i < length; i++)
            {   
                printf("%c", *(chars + i));
            }
        }
        
        printf("\n");
    }
    
    
    int main()
    {
        // Define as array;
        char array_1[LENGTH] = "array_1";
        print(array_1, LENGTH, 16);
        printf("%ld\n", sizeof(array_1));
    
        char array_2[LENGTH];
        strcpy(array_2, "array_2");
        print(array_2, LENGTH, 16);
        printf("%ld\n", sizeof(array_1));
    
    
        char array_3[LENGTH] = {'a', 'r', 'r', 'a', 'y', '_', '3'};
        print(array_3, LENGTH, 16);
        printf("%ld\n", sizeof(array_1));
    
        char array_4[LENGTH] = {'a', 'r', 'r', 'a', 'y', '_', '4', '\0'};
        print(array_4, LENGTH, 16);
        printf("%ld\n", sizeof(array_1));
    
    
        // char array_5[LENGTH];
        // array_5 = "test";
    
        // Define as pointer.
        char* pointer_1 = "pointer_1";
        print(pointer_1, LENGTH, 16);
        printf("%ld\n", sizeof(pointer_1));
    
        // char* pointer_2;
        // strcpy(pointer_2, "pointer_2");
        // print(pointer_2, LENGTH, 16);
    
        // char* pointer_3 = {'p', 'o', 'i', 'n', 't', 'e', 'r', '_', '3'}; 
        // print(pointer_3, LENGTH, 16);
    
        // char* pointer_4 = {'p', 'o', 'i', 'n', 't', 'e', 'r', '_', '3', '\0'};
        // print(pointer_4, LENGTH, 16);
    
        char* pointer_5;
        pointer_5 = "pointer_5";
        print(pointer_5, LENGTH, 16);
        printf("%ld\n", sizeof(pointer_1));
    
        return 0;
    }
    
    
    展开全文
  • c语言结构体学习整理(结构体初始化,结构体指针)

    万次阅读 多人点赞 2018-11-01 20:22:12
    我们都已经学了很多int char …等类型还学到了同类型元素构成的数组,以及取上述类型的指针,在一些小应用可以灵活使用,然而,在我们实际应用,每一种变量进行一次声明,再结合起来显然是太实际的,类如一位...

    渣渣c的c语言学习之路

    1.关于c语言的结构体:

    首先我们为什么要用到结构体,我们都已经学了很多int char …等类型还学到了同类型元素构成的数组,以及取上述类型的指针,在一些小应用可以灵活使用,然而,在我们实际应用中,每一种变量进行一次声明,再结合起来显然是不太实际的,类如一位学生的信息管理,他可能有,姓名(char),学号(int)成绩(float)等多种数据。如果把这些数据分别单独定义,就会特别松散、复杂,难以规划,因此我们需要把一些相关的变量组合起来,以一个整体形式对对象进行描述,这就是结构体的好处。

    2首先我们要了解一些小知识

    2.1**只有结构体变量才分配地址,而结构体的定义是不分配空间的。**
    2.2结构体中各成员的定义和之前的变量定义一样,但在定义时也不分配空间。
    2.3结构体变量的声明需要在主函数之上或者主函数中声明,如果在主函数之下则会报错
    2.4c语言中的结构体不能直接进行强制转换,只有结构体指针才能进行强制转换
    2.5相同类型的成员是可以定义在同一类型下的
    列如

    
    struct Student
    { 
    	int number,age;//int型学号和年龄
    	char name[20],sex;//char类型姓名和性别
    	float score;
    }

    最后的分号不要忘了 有的编译器会自动加上,因此有的同学就会不注意。

    3关于结构体变量的定义和引用

    在编译时,结构体的定义并不分配存储空间,对结构体变量才按其数据结构分配相应的存储空间

    
     struct Book
     { 
     	char title[20];//一个字符串表
    
    示的titile 题目
    	char author[20];//一个字符串表示的author作者
     	float value;//价格表示 
     };//这里只是声明 结构体的定义 
    struct Book book1,book2;//结构体变量的定义 分配空间
    
    book1.value;//引用结构体变量
    

    定义结构体变量以后,系统就会为其分配内存单元,比如book1和book2在内存中占44个字节(20+20+4)具体的长度你可以在你的编译器中使用sizeof关键字分别求出来。
    列如

    当然,要注意一点:用sizeof关键字求结构体长度时,返回的最大基本类型所占字节的整数倍 比方说我们上面求得的为44 为 float(4个字节)的整数倍,
    但是我们把title修改为title[22]; 这时正常长度为46 ,但是你会发现实际求得的为48,(4的整数倍)

    这就涉及到结构体的存储

    1结构体整体空间是占用空间最大的成员(的类型)所占字节数的整数倍。

    2.结构体的每个成员相对结构体首地址的偏移量(offset)都是最大基本类型成员字节大小的整数倍,如果不是编译器会自动补齐,

    关于这个我们简单介绍下:

    1.偏移量----偏移量指的是结构体变量中成员的地址和结构体变量首地址的差。即偏移字节数,结构体大小等于最后一个成员的偏移量加上他的大小,第一个成员的偏移量为0,

    struct S1
    {
        char a;
    
        int b;
    
        double c;
    };
    

    这里char a 偏移量为1 之后为int b 因为偏移量1不为int(4)的整数倍,所以会自动补齐,而在 double c 时,偏移量为8 是double(8)的整数倍,所以不用自动补齐 最后求得结构体得大小为 16

    具体看下图:
    在这里插入图片描述
    通过上面的代码同学们应该会有一个简单的认知

    4结构体变量的初始化

    结构体的初始化有很多需要注意的地方,这里我们说明下
    首先是几种初始化的方法
    ps在对结构体变量初始化时,要对结构体成员一一赋值,不能跳过前面成员变量,而直接给后面成员赋初值,但是可以只赋值前面几个,对与后面未赋值的变量,如果是数值型,则会自动赋值为0,对于字符型,会自动赋初值为NULL,即‘\0’

    4.1定义时直接赋值

    struct Student
    { 
    	char name[20];
    	char sex;
    	int number;
    }stu1={"zhaozixuan",'M',12345};
    //或者
    struct Student
    { 
    	char name[20];
    	char sex;
    	int number;
    }struct Student stu1={"zhaozixuan",'M',12345};
    
    

    注意字符为‘ ’ 字符串为""
    4.2定义结构体之后逐个赋值

    stu1.name="王伟";
    stu1.sex='M';
    stu1.number=12305;
    //也可用strcpy函数进行赋值
    strcpy(stu1.name,"王伟");
    
    

    4.3定义之后任意赋值

     struct Student stu1={
      .name="Wang",
      .number=12345,
      .sex='W', 
     };//可以对任意变量赋值
    

    这样写的好处时不用按照顺序来进行初始化,而且可以对你想要赋值的变量直接进行赋值,而不想赋值的变量可以不用赋值

    需要注意的是如果在定义结构体变量的时候没有初始化,那么后面就不能全部一起初始化了;

    等下结构体数组初始化时我们还会有一个讲解

    这里我们顺带提一下typedef说明结构体类型


    这里的BOOK就相当于struct book的一个别名一样,用它来定义结构体变量非常简便
    主要也是考二级要用到,所以我们简单介绍下

    5结构体变量的引用(输出和输入)

    5.1结构体变量的赋值用scanf赋值和printf输出时跟其他变量操作一样
    但是有几点需要注意
    (1) .是运算符,在所有运算符优先级中最高
    (2)如果结构体的成员本身是一个结构体,则需要继续用.运算符,直到最低一级的成员。

    struct Student
    {	char name[20];
    	char sex;
    	int number;
    	struct Date
    	{
    		int year;
     		int month;
     		int day;
    	}birthday;
    
    }stu1;
    printf("%d",stu1.birthday);//这样子是错误的,因为birthday也是一个结构体变量
    scanf("%d",&stu1.birthday.month);//正确
    

    (3)可以引用接头体变量成员的地址,也可以引用结构体变量的地址:

    printf("%o", student);(输出student的首地址)(%o 按八进制输出)

    6结构体数组及其初始化(重点)

    这里我们简单说下,具有相同类型的结构体变量组成数组就是结构体数组

    结构体数组与结构体变量区别只是将结构体变量替换为数组

    struct Student
    { 
    	char name[20];
    	char sex;
    	int number;
    }stu1[5]={
    	 {"zhaozixuan",'M',12345},
    	 {"houxiaohong",'M',12306},
    	 {"qxiaoxin",'W',12546},
    	 {"wangwei",'M',14679},
    	 {"yulongjiao",'W',17857}
    };
    stu1[3].name[3]//表示stu1的第三个结构变量中姓名的第五个字符
    //若初始化时已经是结构体数组全部元素[]中的数可以不写如stu1[]=
    

    注意结构体数组要在定义时就直接初始化,如果先定义再赋初值是错误的
    比如:

    struct Student stu1;
    stu1[3]={
      {"zhaozixuan",'M',12345},
      {"houxiaohong",'M',12306},
      {"qxiaoxin",'W',12546}
      };
      
    

    这样子是错误的,

    这里我在写的时候遇到一些问题,还是结构体数组初始化的问题,折腾了下解决了,给大家分享下
    对于数组初始化时
    比如

    char str[20];
    str="I love you";/* 这样会修改数组的地址,但是数组的地址分配之后是不允许改变的 */
    
    

    在第一条语句中 str就已经被定义成数组而在C99标准中不允许将字符串(实际上是一个指针变量) 赋值给数组,所以如果我们直接赋值是错误的

    那么怎么弄呢
    这里提供3种方法

    1.定义数组时直接定义
    char str[20]=“I love you”;

    2.用strcpy或者memset函数进行复制
    char str[20];
    strcpy(str,“I love you”);
    再用到memset函数时,出现了一些问题
    对于memcset函数简单介绍下

    memset
    void *memset(void *s,int c,size_t n)
    作用:将已开辟内存空间s的首n个字节的值设为值c。

    char str[20];
    memset(str,'a',20);
    

    如果是字符类型数组的话,memset可以随便用,但是对于其他类型的数组,一般只用来清0或者填-1,如果是填充其他数据就会出错

    int str[10];
    memset(str,1,sizeof(str));//这样是错误的
    
    

    这里我们说下这个错误,

    首先我们要知道memset在进行赋值时,是按字节为单位来进行赋值的,每次填充的数据长度为一个字节,而对于其他类型的变量,比如int,占4个字节 所以sizeof(str)=40; 而用memset赋值时,将会对指向str地址的前40个字节进行赋值0x01(00000001) 的操作,把0x00000000赋值4次0x01操作变为0x01010101(00000001000000010000000100000001)

    相当于给“前10个int”进行了赋值0x01010101的操作 对应十进制的16843009
    所以会出很大的错误

    这里请务必要注意,但是如果是清零一个数组用memset还是很方便的
    简单使用的话同学们用strcmp函数就行

    3用指针(注意内存分配)
    char *str;
    str=“I love you”;

    这两句话的本质是,在内存中开辟一段内存空间,把"I love you"放进这段内存空间,然后把这段内存空间的地址交给str,由于str是变量,所以给它赋值是合法的。

    请注意,在我们进行数组初始化的时候如果定义的数组过长,而我们只初始化了一部分数据,对于未初始化的数据如果是数值型,则会自动赋值为0,对于字符型,会自动赋初值为NULL,即‘\0’ 即不足的元素补以默认值
    这里我们在4小节中也提到了
    比如

    int str[10]={1};//这里只是把str的第一个元素赋值为1,其他元素默认为0
    
    



    7结构体与指针

    我们知道,指针指向的是变量所占内存的首地址,在结构体中,指针指向的是结构体变量的起始地址,当然也可指向结构体变量的元素
    这里我们分为三部分
    7.1指向结构体变量的指针

    定义形式一般为
    struct 结构体名* 指针名;
    比如: struct Student* p;

    struct Student
    {	
    	char cName[20];
     	int number;
     	char csex;  
    }student1;
    struct Student*p;
    p=&student1;
    //若为结构体数组则
    struct Student stu1[5];
    struct Student*p;
    p=stu1;//因为stu1为结构体数组而p=stu1直接是指向stu1的首地址,就不用再加&符
    
    

    用结构体指针变量访问结构体变量成员有以下两种方式:
    (*p).cName //这里的括号不能少,在5.1中有提到
    p->cName

    简单来说以下三种形式是等价的

    p->cName
    (*p).cName 
    student1.cName
    p->cName //可以进行正常的运算
    

    p->number++; 是将结构体变量中number的值进行运算,然后再加一,
    这里要注意下,等下在7.2中会有比较

    7.2指向结构体数组的指针

    7.1中我们已经提到结构体数组指针的命名,这里我们仅对一些知识点做下介绍
    这里我们接着来说结构体数组指针
    在我们想要用指针访问结构体数组的第n个数据时可以用

    struct Student stu1[5];
    struct Student*p;
    p=stu[n];
    (++p).number//是指向了结构体数组下一个元素的地址
    
    

    7.3结构体成员是指针类型变量
    比如

    struct Student
    {
     	char* Name;//这样防止名字长短不一造成空间的浪费
     	int number;
     	char csex;  
    }student1;
    
    

    在使用时可以很好地防止内存被浪费,但是注意在引用时一定要给指针变量分配地址,如果你不分配地址,结果可能是对的,但是Name会被分配到任意的一的地址,结构体不为字符串分配任何内存存储空间具有不确定性,这样就存在潜在的危险,

    struct Student
    {
     	char* Name;
     	int number;
     	char csex;  
    }stu,*stu;
    
    stu.name=(char*)malloc(sizeof(char));//内存初始化
    

    这里我们说一下,同学们看书的时候一般不会看到,
    如果我们定义了结构体指针变量,他没有指向一个结构体,那么这个结构体指针也是要分配内存初始化的,他所对应的指针类型结构体成员也要相应初始化分配内存

    struct Student
    {
     	char* Name;
     	int number;
    	char csex;  
    }stu,*stu;
    stu = (struct student*)malloc(sizeof(struct student));./*结构体指针初始化*/
      stu->name = (char*)malloc(sizeof(char));/*结构体指针的成员指针同样需要初始化*/  
    
    

    7.4二叉树遍历算法
    二叉树的二叉链表类型定义如下:
    typedef struct btnode {
    datatype data;
    struct btnode *lchild,*rchild;
    };
    这里我们仅仅提出以下,因为涉及到链表,感兴趣的同学可以去学习下(二级要用),
    7.5结构体作为函数参数

    首先我们要注意的一点,使用结构体变量作为函数参数的时候,采取的是值传递的方式,将结构体所占内存单元的内容全部传递给形参,并且形参必须也要是同类型的结构体变量,在使用时,会自动创建一个结构体变量作为原变量的副本,并且也需要占内存,并且在调用期间如果修改(形参)结构体中成员的值,修改值是无效的

    而如果用指针作为实参,传递给函数的形参,这时候传递的是结构体的地址,形参所指向的地址就是结构体变量的地址,这时候进行修改的话是可以修改的,这正是指针的精华所在

    在这里我们再提供几种互换两个结构体的方法

    struct Student
    {
     char cName[20];
     int number;
     char csex;  
    }student1,student2;
    struct Student student1={"Wang",12345,'W'};
    struct Student student2={"Zhao",54321,'M'}; 
    struct Student*stu1=&student1;
    struct Student*stu2=&student2;
    
    struct Student *student3;
    student3=stu1;
    stu1=stu2;
    stu2=student3;//互换地址
    
    2对于同类型结构体直接互换值就行
    struct stu student3;
    student3=student1;
    student1=student2;
    student2=student3;
    //这里也可以写成应strcmp函数互换
    
    3memcpy()函数进行互换
    
    
    4比较笨的方法: 用for循环互换
    

    最后提下memset清空结构体

    struct Student
    {
     char cName[20];
     int number;
     char csex;  
    }stu1;
    
    一般情况下,清空str的方法:
      str.cName[0]='\0';
      str.csex='0';
      str.number=0;
      但是我们用memset就非常方便:
      memset(&str,0,sizeof(struct Student));
      如果是数组:
      struct Student stu[10];
      就是
      memset(stu,0,sizeof(struct Student)*10);
    

    整理不易,点个赞再走呗!

    展开全文
  • 我们再看看这个UNICODE_STRING结构。... //---字符串的长度(字节数) USHORT MaximumLength; //---字符串缓冲区的长度(字节数) PWSTR Buffer; //---字符串缓冲区。 }ANSI_STRING, *PANSI_STRING; UNIC

    我们再看看这个UNICODE_STRING结构。

    typedef struct  _UNICODE_STRING
    {
    	USHORT Length;		//---字符串的长度(字节数)
    	USHORT MaximumLength;	//---字符串缓冲区的长度(字节数)
    	PWSTR Buffer;			//---字符串缓冲区。
    }ANSI_STRING, *PANSI_STRING;
    UNICODE_STRING str;
    读者应该注意到,这个结构中并不含有字符串缓冲的空间,这是一个初学者常见的出问题的来源,以下代码是完全错误的,内核会立刻崩溃:

    UNICODE_STRING str;
    wcspy(str.Buffer, L("my first string"));
    str.Length = str.MaximumLength = wcslen(L"my first string") * sizeof(WCHAR);
    以上的代码定义了一个字符串并试图初始化它的值,但是非常遗憾,这样做不是对的,因为str.Buffer 只是一个未初始化的指针,它并没有指向有意义的空间,相反,以下的方法是正确的:

    UNICODE_STRING str;
    str.Buffer = L"my first string";
    str.Length = str.MaximumLength = wcslen(L"my first string") * sizeof(WCHAR);
    实际上明显的初始化写法如下:

    UNICODE_STRING str = 
    {
    	sizeof(L"my first string") - sizeof((L"my first string")[0]),
    	sizeof(L"my first string"),
    	L"my first string"
    };
    但是这样定义一个字符串实在太繁琐了,但是在头文件 ntdef.h 中有一个宏方便这种定义。使用这个宏之后,我们就可以简单的定义一个常数字符串。如下:

    #include <ntdef.h>
    
    UNICODE_STRING str = RTL_CONSTANT_STRING(L"my first string");

    这只能在定义这个字符串的时候使用,为了随时初始化一个字符串,可以使用  RtInitUnicodeString。示例如下:

    UNICODE_STRING str = RtlInitUnicodeString(&str, L"my first string");
    用本节的方法初始化字符串,不用担心内存释放方面的问题。因为没有分配任何内存。

    -------摘自《[天书夜读-从汇编到Windows内核编程]》
    ---------------------------------------------------------------------------------------------------------

    与原文可能有出入,有些自己的理解。

    -----------------------------------------------------------------------------------------------------------------

    展开全文
  • 字符数组初始化问题

    千次阅读 2018-01-08 13:29:24
    在C语言编程,当我们声明一个字符串数组的时候,常常需要把它初始化为空串。总结起来有以下三种方式: (1) char a[10]=""; (2) char a[10]={'\0'}; (3) char a[10]; str[0]='\0'; 第1,2种方式是将a数组的所有...

    在C语言编程中,当我们声明一个字符串数组的时候,常常需要把它初始化为空串。总结起来有以下三种方式:

    • (1) char a[10]="";
    • (2) char a[10]={'\0'};
    • (3) char a[10]; str[0]='\0';

    第1,2种方式是将a数组的所有元素都初始化为'\0',而第3种方式是只将str数组的第一个元素初始化为'\0'。如果数组的size非常大,那么前两种方式将会造成很大的开销。

    所以,除非必要(即我们需要将str数组的所有元素都初始化为0的情况),我们都应该选用第3种方式来初始化字符串数组。

    几个错误的实例

     int arrayl[5]={1,2,3,4,5,6}; //error-初始化值个数多于数组元素个数

    2     int array2[5]={1,,2,3,4}; //error:初始化值不能省略
    3     int array3[5]={1,2,3,}; //error:初始化值不能省略
    4     int array4[5]={}; //error:语法格式错误

    初始化值的个数可少于数组元素个数。当初始化值的个数少于数组元素个数时,前面的按序初始化相应值, 后面的初始化为0(全局或静态数组)或为不确定值(局部数组)。

    2.初始化字符数组


      初始化字符数组有两种方法,一种是:
        char array[10]={"hello"};
      另一种是:
        char array[10]={'h','e','l','l','\0'}
      第一种方法用途较广,初始化时,系统自动在数组没有填值的位置用,'\0'补上。另外, 这种方法中的花括号可以省略,即能表示成:
        char array[10]="hello";
      第二种方法一次一个元素地初始化数组,如同初始化整型数组。这种方法通常用于输入不容易在键盘上生成的那些不可见字符。
      例如,下面的代码中初始化值为若干制表符:
        char chArray[5]={'\t','\t','\t','\t','\0');
      这里不要忘记为最后的,'\0'分配空间。如果要初始化一个字符串"hello",那为它定义的数组至少有6个数组元素。
      例如,下面的代码给数组初始化,但会引起不可预料的错误:
        char array[5]="hello";
      该代码不会引起编译错误,但由于改写了数组空间以外的内存单元,所以是危险的。

    展开全文
  • 字符串的定义与赋值及初始化

    万次阅读 多人点赞 2013-06-18 14:08:57
    字符串的定义与赋值及初始化 C语言的运算符根本无法操作字符串。在C语言字符串当作数组来处理,因此,对字符串的限制方式和对数组的一样,特别是,它们都能用C语言的运算符进行复制和比较操作。 怎么给这个...
  • Java基础知识面试题(2020最新版)

    万次阅读 多人点赞 2020-02-19 12:11:27
    核心类库主要是java.lang包:包含了运行Java程序必可少的系统类,如基本数据类型、基本数学函数、字符串处理、线程、异常处理类等,系统缺省加载这个包 如果想要运行一个开发好的Java程序,计算机只需要安装JRE...
  • 在程序设计,为了方便处理,通常把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称为数组。...本文主要介绍一维数组、二维数组和字符数组,其余的数组将会在以后的文章介绍到...
  • 字符数组的初始化,最容易理解的方式就是逐个字符赋给数组各元素。 char str[10]={ ‘I’,’ ‘,’a’,’m’,’ ‘,‘h’,’a’,’p’,’p’,’y’}; 即把10个字符分别赋给str[0]到str[9]10个元素 如果花括号...
  • 在C语言,将字符串作为字符数组来处理。C语言规定了一个“字符串结束标志”,以... 用字符串常量来初始化字符数组,例如: /* 例1 */ char str[] = {"I am happy"}; //也可以省略花括号 char str[] = "I am h...
  • Java面试题大全(2020版)

    万次阅读 多人点赞 2019-11-26 11:59:06
    本套Java面试题大全,全的能再全,哈哈~ 一、Java 基础 1. JDK 和 JRE 有什么区别? JDK:Java Development Kit 的简称,java 开发工具包,提供了 java 的开发环境和运行环境。 JRE:Java Runtime Environ...
  • c语言字符数组与字符串的使用详解

    万次阅读 多人点赞 2018-04-13 16:53:00
    转载自 https://blog.csdn.net/smf0504/article/details/516735291、字符数组的定义与初始化字符数组的初始化,最容易理解的方式就是逐个字符赋给数组各元素。char str[10]={ 'I',' ','a','m',' ',‘h','a','p','...
  • a:动态初始化 只指定长度,由系统给出初始化值 格式: * 数据类型[] 数组名 = new 数据类型[数组长度]; * int[] arr = new int[5]; b:静态初始化的格式: * 格式:数据类型[] 数组名 = new 数据类型[]{...
  • 字符串,是Java最常用的一个数据类型了。关于字符串的知识,作者已经发表过几篇文章介绍过很多,如: Java 7 源码学习系列(一)——String 该如何创建字符串,使用” “还是构造函数? 我终于搞清楚了和S...
  • 方式1:当字符为结束符时,从头到尾扫描,遇非空格则拷贝(可删除字符串中所有空格) 方式2:当字符为结束符时,i从头扫描,遇空格则i++;j从尾扫描,遇空格则j--。最终确定字符串长度,一次性拷贝(只能删除非...
  • 结构体中字符串赋值

    万次阅读 多人点赞 2016-06-26 23:49:05
    #include using namespace std; struct student { int num; char name[10]; }; int main() { student st; st.num = 10; //st.name = "linjunjie... //字符串不能用=赋值 strcpy(st.n
  • C++ STL string字符串详解和使用方法

    千次阅读 2020-02-07 18:28:21
    能以一个单字符初始化字符串,但是可以这样做: string a('a');//错误 string b(1, 'a');//正确 string c({ 'a' });//正确 表示存在一个从const char* 到string的自动类型转换,但存在一个从char到s...
  • 前端面试题(持续更新

    万次阅读 多人点赞 2019-11-06 17:16:33
    前端面试题 1.闭包 闭包就是能够读取其他函数内部变量的函数。 闭包的缺点:滥用闭包函数会造成内存泄露,因为闭包引用到的包裹函数定义的变量都 ...字符串 布尔 数值 空值 未定义 对象 引用数据类型:Objec...
  • C语言数组之字符串

    万次阅读 多人点赞 2018-11-20 01:55:35
    最近各大工作室都发布了一些与字符串有关的题目,同学们在写有关字符串的题目时候会感到吃力,或是无从下手,没有思路,或是一些基本的知识明白。这里我就讲解下与字符串有关的基本知识 字符串,它是由多个字符...
  • C++ 语言是个十分优秀的语言,但优秀并表示完美。还是有许多人愿意使用C或者C++,为什么?原因众多,其中之一就是C/C++的文本处理功能太麻烦,用起来很方便。以前没有接触过其他语言时,每当
  • C语言 字符串的读取

    千次阅读 2020-07-03 23:08:23
    对数组的初始化 以下3种形式都可以实现字符数组的初始化赋值。...除了初始化赋值的时候,能将数组的初始值或字符串直接赋予数组变量。 以下3种是错误的赋值方式: char str[6]; 1. str = {'V', 'V', 'c', 'a', 't'
  • C语言

    万次阅读 多人点赞 2019-12-18 23:01:50
    44.C语言是结构程序设计语言 45.c程序要通过编译,连接才能得到可执行的目标程序 46.用c语言编写程序,可以编写出任何类型的程序 47.C语言允许有空函数 48.C程序书写格式,允许一行内可以写几个语句 49.C程序的...
  • C语言再学习 -- 字符串字符串函数

    千次阅读 2016-09-01 09:27:55
    最近身体很给力,很乏累!白天没精神,晚上睡着,心情还很烦躁。看书都有点看下去的样子,到了C语言最难掌握的部分了,数组、指针、字符串。...字符常量,又称字符串文字,是指位于一对双引号的任何字符。双...
  • Python语言的for循环直接迭代对象集合的元素,如果需要在循环使用索引下标访问集合元素,则可以使用内置的enumerate()函数 enumerate()函数用于将一个可遍历的数据对象(例如列表、元组或字符串)组合为一个...
  • 字符串定义方法

    千次阅读 2020-03-04 16:13:35
    一、字符数组 对字符数组,有以下几种定义方法: char str[]="12345"; 或给字符串加上大括号: ...这种方法定义时,系统会自动在字符串的...这种方法定义时,系统会自动从未初始化的元素开始,将之后的元素赋为\0...
  • 最大的区别就是C风格的字符串是静态的,可以动态变化,使用极为麻烦。 而C++的std::string类型动态管理,非常方便。 C风格字符串和char数组是一样的,看下面两种定义: char carr1 = {'a', 'b', 'c'}; ...
  • C语言各种变量的初始化

    万次阅读 多人点赞 2018-10-07 23:19:00
    数值类变量初始化 整型、浮点型的变量可以在定义的同时进行初始化,一般都初始化为0。 int inum = 0; float fnum = 0.00f; ... double dnum = 0.00;...字符串初始化的方法比较多,我这里简单介绍三种...
  • 字符数组的初始化,最容易理解的方式就是逐个字符赋给数组各元素。 char str[10]={ ‘I’,’ ‘,‘a’,‘m’,’ ‘,‘h’,‘a’,‘p’,‘p’,‘y’}; 即把10个字符分别赋给str[0]到str[9]10个元素 如果花括号...
  • 字符串常量,放在哪个存储区呢?是“自动存储区”还是“静态存储区”? 比如: char *pstr=“hello world!”; 这里,"hello world!"是一个字符串常量, pstr是在栈的变量。 我想问,字符串常量,在哪个内存区域...
  • C语言字符串处理函数

    千次阅读 2019-04-02 17:15:38
    1、strcpy():复制字符串 2、strncpy():复制n个字符串 3、strcat():连接字符串 4、strncat():连接n个字符串 5、strcmp():字符串比大小 6、strlen():字符串长度 7、strset():字符串重置 9、memset():...
  • (3)std::begin 和 std::end 1.2 动态数组 2 字符串 2.1 Char型数组 (1)创建计数器 (2)利用ASCII码 (3)库函数 2.2 Byte型数组(暂无) 2.3 String型字符串 3 总结 数组与字符串 在C语言,最精彩的地方果然...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 176,626
精华内容 70,650
关键字:

以下字符串初始化中不正确