30-C语言中的字符串

注:博客中内容主要来自《狄泰软件学院》,博客仅当私人笔记使用。

测试环境:Ubuntu 10.10

GCC版本:4.4.5

一、字符串的概念

1) 字符串是有序字符的集合

2) 字符串是程序中的基本元素之一

3) C语言中没有字符串的概念

         - C语言中通过特殊的字符数组模拟字符串

         - C 语言中的字符串是以\0结尾的字符数组

 

扫描二维码关注公众号,回复: 8829141 查看本文章

二、字符数组与字符串

1) 在C语言中,双引号应用的单个或多个字符串是一种特殊的字面量

         - 存储于程序的全局只读存储区(不能修改字符串,会导致程序崩溃)

         - 本质为字符数组,编译器自动在结尾加上\0字符(所有字符串都有)

 

         下面那些是字符串的定义?

char ca[]={'H','e','l','l','o'};           不是字符串
char sa[]={'W','o','r','l','d','\0'};      是字符串
char ss[]="Hello world!";                  是字符串
char* str="Hello world!";                  是字符串

 

实例分析
字符数组与字符串
30-1.c
#include <stdio.h>
 
int main()
{
    char ca[] = {'H', 'e', 'l', 'l', 'o'};
    char sa[] = {'W', 'o', 'r', 'l', 'd', '\0'};
    char ss[] = "Hello world!";
    char* str = "Hello world!";
   
    printf("%s\n", ca);
    printf("%s\n", sa);
    printf("%s\n", ss);
    printf("%s\n", str);
   
    return 0;
}

操作:

1) gcc 30-1.c -o 30-1.out编译正确,打印结果:

HelloWorld        //不是我们期望的Hello
World
Hello world!
Hello world!
分析:
        ca[]存储的字符没有'\0',格式%s打印时必须获取'\0'才终止。ca[]和sa[]是栈上连续定义的两个数组,它们的内存是分布是紧密相连的。ca[]没有存储'\0',sa[]存储了'\0',因此打印结果为HelloWorld。
 

 

三、鲜为人知的小秘密

1) 你知道吗?

         - 字符串字面量的本质是一个数组

         - 字符串字面量可以看作常量指针(仅仅是为了方便理解,并不是常量指针:const char* s)

         - 字符串字面量中的字符串不可改变(存储在只读存储区,修改会导致程序崩溃)

         - 字符串字面量至少包含一个字符——'\0'

“Hello World!”   

四、字符串字面量

1) “Hello World!”是一个无名的字符数组

         下面的表达式正确吗?

char b = "abc"[0];           //字符数组第0个元素,类似a[0]
char c = *("123"+1);         //首地址+1,类似数组首地址a+1指向a[1]
char t = *"";                //表示0

 

实例分析
字符串字面量的本质
30-2.c
#include <stdio.h>
 
int main()
{
    char b = "abc"[0];            //相当于a[0]
    //char b = "abc"[1];          //相当于a[1]
    char c = *("123" + 1);
    char t = *"";
   
    printf("%c\n", b);
    printf("%c\n", c);
    printf("%d\n", t);
   
    printf("%s\n", "Hello");
    printf("%p\n", "World");
   
    return 0;
}

操作:

1) gcc 30-2.c -o 30-2.out编译正确,打印结果:

a
2
0
Hello
0x804856e
分析:
        字符串字面量是无名的字符数组。
 

 

五、字符串的长度

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

2) 字符串长度指的是第一个'\0'字符前出现的字符个数(重点)

3) 通过'\0'结束符来确定字符串的长度

4) 函数strlen用于返回字符串的长度

char s[] = "Hello";
        
printf("%d\n",strlen(s));               //5
printf("%d\n",strlen("123"));           //3
编程实验
strlen的使用
30-3.c
 
#include <stdio.h>
#include <string.h>
 
int main()
{
    char s[] = "Hello\0world";        //所有字符串都依赖于第一个\0
    int i = 0;
   
    for(i=0; i<sizeof(s)/sizeof(char); i++)
    {
       printf("%c\n", s[i]);      //字符打印会显示所有字符,包括\0    
    }
   
    printf("%s\n", s);    //打印字符串:第一个'\0'认为字符串结束
 
    printf( "%d\n", strlen(s) );
    printf( "%d\n", strlen("123") );
 
    return 0;
}
显示:
H
e
l
l
o
 
w
o
r
l
d
 
Hello
5
3

操作:

1) gcc 30-3.c -o 30-3.out编译正确,打印结果:

H
e
l
l
o
     //'\0'不能显示打印出来
w
o
r
l
d
     //'\0'不能显示打印出来 
Hello
5
3

小结:

1) C语言中通过字符数组模拟字符串

2) C语言中的字符串使用'\0'作为结束符

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

4) 字符串相关函数都依赖于结束符'\0'

发布了40 篇原创文章 · 获赞 1 · 访问量 1752

猜你喜欢

转载自blog.csdn.net/piaoguo60/article/details/104080347