zoukankan      html  css  js  c++  java
  • C语言学习笔记--字符串

    字符串是有序字符的集合,C 语言中没有字符串的概念,而是通过特殊的字符数组模拟字符串,是以''结尾的字符数组。

    1.字符数组与字符串

    (1)在 C 语言中,字双引号引用的单个或多个字符是一种特殊的字面量,被存储于程序的全局只读存储区,在本质上为字符数组,编译器自动在结尾加上''字符。

    #include <stdio.h>
    
    int main()
    {
    char ca[] = {'H','e','l','l','0'}; //栈,字符数组,注意没有 char sa[] = {'W','o','r','l','d',''}; // char ss[] = "Hello world!";//栈。从语义上看,要用"Hello World!"这个 //字符数组去初始化ss数组,编译器会直接 //用这个字符数组的每个元素,去初始化栈上 //ss数组中的元素。作为优化,"Hello World!" //这个字符串就可以不必保存在全局只读区, //而只出现在栈上。因此ss[0] = 'h' //这个的语句是合法的。 char* str = "Hello World!"; //全局只读存储区,str[0]='h'是非法的 printf("%s ", ca); //输出Hello及后面的内容,直到在内存中遇到 printf("%s ", sa); //输出Hello World! printf("%s ", ss); //输出Hello World! printf("%s ",str); //输出Hello World! ss[0] = 'h'; //栈,合法 printf("%s ", ss); //输出Hello World! //str[0] = 'h'; //全局只读存储区,非法 printf("%s ", str); //输出Hello World! return 0; }

    (2)字符串字面量的本质是一个数组,如“Hello World!”是一个无名的字符数组

    (3)字符串字面量可以看作常量指针

    (4)字符串字面量中的字符不可改变

    (5)字符串字面量至少包含一个字符,即''

    #include <stdio.h>
    
    int main()
    {
    //本质上字符串字面量是一个字符数组,形如"Hello World!"是一个 //无名的字符数组。 char b = "abc"[0]; //合法,指向字符数组的第0个元素,即a char c = *("123" + 1);//合法,取出字符数组第2个元素,即2 char t = *""; //字符串字面量至少包少一个,即t='' printf("%c ", b); //'a' printf("%c ", c); //'2' printf("%d ", t); //0 printf("%s ","Hello"); printf("%p ","World"); //输出字符串字面量的地址(全局区中) return 0; }

    2.字符串的长度

    (1)字符串的长度就是字符串所包含字符的个数

    (2)字符串长度指的是第一个''字符前出现的字符个数,通过''结束符来确定字符串的长

    (3)函数 strlen 用于返回字符串的长度(不含'')。

    #include <stdio.h>
    #include <string.h>
    
    int main()
    {
    char s[]="HelloWorld!"; int i = 0; //输出s数组中所有的元素 for(i=0; i<sizeof(s)/sizeof(*s); i++) { printf("%c",s[i]); } printf(" "); printf("%s ",s);//输出:Hello,因为遇到第1个就结束 printf("%d ",strlen(s)); //输出5 printf("%d ",strlen("123")); //3 return 0; }

    3.snprintf 函数(gcc 下为 snprintf,vc 为_snprintf)

    snprintf 函数本身是可变参数函数,原型如下:

    int snprintf(char* buffer,int buf_size,const char* format,...);

    当函数只有 3 个参数时,如果第 3 个参数没有格式化信息,函数调用是没有问题的;相反如果第 3 个参数包含了格式化信息,但缺少后续对应参数,则程序行为不确定。格式化信息必须与变参个数相匹配。

    #include <stdio.h>
    
    int main()
    {
        char buf[20] = { 0 };
        //char src[] = "hello %s";//字符串中包含格式化信息,输出会异常
        char src[] ="hello world!";//不含格式化信息,则正常输出
    
        //因src中含有格式化信息,所以这种行为不确定,
        //输出hello会,后面可能跟一个奇怪的字符串。
        snprintf(buf, sizeof(buf), src);
    
        printf("buf = %s
    ", buf);
    
        return 0;
    }

    4.字符串长度的计算

    (1)字符串相关的函数均以第一个出现的''作为结束符

    (2)编译器总是会在字符串字面量的末尾添加''。

    (3)字符串字面量的本质为数组

    (4)字符串、字符数组、字符指针是不同的 3 个概念。

    #include <stdio.h>
    #include <string.h>
    
    int main()
    {
        #define STR "Hello, World!"
        
        char* src = STR;
        char buf[255] = {0};
        
        snprintf(buf, sizeof(buf), src);
        
        printf("strlen(STR) = %d
    ", strlen(STR));  //7
        printf("sizeof(STR) = %d
    ", sizeof(STR));  //16,字符串字面量变质为
                                                    //字符数组,并编译器
                                                    //在最后加一个''
        printf("strlen(src) = %d
    ", strlen(src));  //7,遇第1个结束
        printf("sizeof(src) = %d
    ", sizeof(src));  //4,指针大小
    
        printf("strlen(buf) = %d
    ", strlen(buf));  //7,遇第1个结束
        printf("sizeof(buf) = %d
    ", sizeof(buf));  //255,buf数组的大小
    
        printf("src = %s
    ", src); //hello, 共6个字符,含一个空格
        printf("buf = %s
    ", buf); //hello, 共6个字符,含一个空格
    
        return 0;
    }

    5.字符串相等的比较

    (1)字符串之间的相等比较需要用 strcmp 完成

    (2)不可直接用==进行字符串直接的比较

    (3)完全相同的字符串字面量的==比较结果为 false。但一些现代编译器(如 gcc)能够将相同的字符串字面量映射同一个无名字符数组,因此==比较结果为 true。正因这个行为,所以我们不应编写依赖特殊编译器的代码!

    #include <stdio.h>
    #include <string.h>
    
    int main()
    {
        #define S1 "Hello World!"
        #define S2 "Hello World!"   
       
        //S1和S2存于常量区中,因两者内容完全一样,存于全局只读区。
        //一些现代的编译器会将S1和S2映射到同一个字符数组中。
        if(S1 == S2) //gcc、Vc下相等,bcc下不相等!
        {
            printf("Equal
    ");
        }else{
            printf("Non Equal
    ");
        }
    
        if(strcmp(S1,S2) == 0) //判断两个字符串是否相等。
        {
            printf("Equal
    ");
        }else{
            printf("Non Equal
    ");
        }
    
        return 0;
    }

    参考资料:
    www.dt4sw.com
    http://www.cnblogs.com/5iedu/category/804081.html

  • 相关阅读:
    解决gsoap中文乱码的问题
    30个高质量的旅游网站设计
    Windows Azure功能更新:弹性伸缩(autoscale)、监控报警、移动服务及网站服务商用、新的虚拟机镜像
    工作站服务没有启动 解决办法
    直方图与匹配
    横瓜先生关于如何利用MYSQL数据库设计CMS系统处理100亿级TB规模的数据量
    IOS设计模式学习(6)生成器
    关于页面上某些点击事件无效的问题
    lll
    android sqlite使用之模糊查询数据库数据的三种方式
  • 原文地址:https://www.cnblogs.com/CoderTian/p/5907886.html
Copyright © 2011-2022 走看看