zoukankan      html  css  js  c++  java
  • 字符数组、字符串及常量字符串具体解释

    常量字符串:

    C语言中

    void main(){
    	char* p1 = "abcd";  //"abcd"是字符串常量
        char* p2 = "abcd";
    	char* p3 = "china"; //"china"也是字符串常量
        printf("p1=%o
    p2=%o
    p3=%o
    ", p1, p2,p3);
    }
    执行结果:

    p1和p2所指向的常量字符串内容同样并且地址也同样。

    个人理解由于常量字符串位于静态区,p1指向的“abcd”已经分配了空间,p2所指向的常量字符串与p1指向的常量字符串同样。所以不须要另外开辟空间。有些文章说,这取决于编译器。


    常量字符串内容不可更改。但能够通过下标和移动指针来訪问

    void main(){
    	char* p1 = "abcd";  //"abcd"是字符串常量
    	printf("%s
    ",p1); //打印常量字符串
        printf("%c
    ",*p1);  //获得第一个字符
    	printf("%c
    ",*(p1+1)); //能够通过移动指向常量的指针来訪问常量字符串中的字符
    	printf("%c
    ",p1[1]);  //能够通过下标来訪问常量字符串中的字符
    	//p1[1]='d'; 编译没有问题。执行出错
    }
    执行结果


    字符串输入:

    void main(){
    	char* p1;  //p1指针指向的地址为随机的。并且没有分配空间,禁止向p1指向的内容输入内容
    	scanf("%s",p1);
    
    	char* p2=""; //""常量字符串。仅仅读不可写
    	scanf("%s",p2);
    
    	char* p3=NULL; //NULL为0。地质空间首地址。绝对不同意写入内容
    	scanf("%s",p3);
    }
    以上程序执行都会出错,在C语言中正确的输入字符串,是通过做够长的字符数组来实现

    void main(){
    	char a[10];
    	scanf("%s",a); //同意最大输入的字符个数为9。回车后在在字符末尾加''
    	printf("%s
    ",a); //打印字符串
    	for(int i =0 ;i < 10 ;i++){ //输出字符数组中的字符
    		printf("%c
    ",a[i]);
    	}
    }
    执行结果:

    可见在4的末尾有一个不可见字符‘’,由于数组长度为10。后面5个元素没有赋值,所以出现乱码。通过gets输入字符串效果和scanf一致。但下面情况须要注意:

    void main(){
    	char a[3];
    	gets(a); //能够输入超过2个的字符。scanf跟gets一致
    	puts(a);
    }
    执行结果:

    数组大小为3。按道理最多仅仅能输入长度为2的字符串并在字符串最后补一个'',这样刚好存满整个数组。但如今输入了长度为4的字符串并且没有出错。但这仅仅是幸运的,非常多情况该程序会崩溃,由于数组越界,数组相邻的空间可能是重要的数据。所以C语言中数组越界的情况须要程序猿自己去把握,数组越界带来的后果是非常严重的。

    还须要注意一点是,在C语言中用scanf输入字符串会以空格和回车符为间隔

    void main(){
    	char a[100];
    	scanf("%s",a);
    	puts(a);
    }

    执行结果:

    输入的字符串为“abc空格efg”,但实际存储的不过“ abc”,所以当想给多个字符数组赋值时,能够通过空格或回车来输入。

    void main(){
    	char a[100];
    	char b[100];
    	char c[100];
    	scanf("%s%s%s",a,b,c);
    	puts(a);
    	puts(b);
    	puts(c);
    }

    执行结果:



    gets则不会出现这样的情况,这是gets和scanf主要差别,gets和scanf另一个差别就是gets仅仅能输入一个字符串,而scanf能够输入多个。

    gets通过回车来确认字符串输入的结束,scanf通过回车或者空格符来确认字符串输入的结束

    void main(){
    	char a[100];
    	gets(a);
    	puts(a);
    }
    


    void main(){
    	char a[10]={"1234"}; //与char a[10]="1234"等效。在输入字符串最后会补一个''
    	printf("%s
    ",a); //打印字符串
    	for(int i =0 ;i < 10 ;i++){ //输出字符数组中的字符
    		printf("%c
    ",a[i]);
    	}
    }
    执行结果:

    可见直接初始化字符数组。缺省的空间以''填补。这点与scanf和gets不同。须要注意。


    字符串的输出:

    输出就比較简单,通过printf和puts就能够了,两者的差别在于puts输出字符串之后会换行。


    字符数组:

    字符数组非常好理解无非就是char a[10];
    void main(){
    	char a[10]={'a','b','c'};
    	for(int i = 0 ; i< 10;i++)
    		printf("%c
    ",a[i]);
    }
    执行结果:
    可见字符数组缺省的空间以‘’填补

    void main(){
    	char a[2]={'a','b'};
    	puts(a);
    }
    执行结果:
    若字符数组已满,并且最后一个字符不是'',则总体输出数组超出数组长度的内容会是乱码。


  • 相关阅读:
    内置函数(十)
    常用命令
    函数式编程(九)——map,filter,reduce
    函数(八)-函数和匿名函数
    设计模式(十三)——观察者模式
    Confluence 6 重要缓存和监控
    Confluence 6 数据中心的缓存
    Confluence 6 配置文件和key
    Confluence 6 缓存性能示例
    Confluence 6 缓存性能优化
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5240786.html
Copyright © 2011-2022 走看看