--事物的难度远远低于对事物的恐惧!
这篇我们开始来谈谈C语言中的字符串,首先来看看字符串是个 什么东西:
-字符串是有序字符的集合
-字符串是程序中的基本元素之一
-C语言中没有字符串的概念
-C语言中通过特殊的字符数组模拟字符串
-C语言中字符串是以 '\0' 结尾的字符数组
字符数组与字符串:
-C语言中,双引号引用的单个或多个字符是一种特殊的字面量
-存储于程序的全局只读存储区
-本质为字符数组,编译器自动在结尾加上 '\0' 字符
有了以上的概念,来看看下边代码中哪些是字符串的定义,看看输出和你想的一样不
#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("ca = %s\n", ca);
printf("sa = %s\n", sa);
printf("ss = %s\n", ss);
printf("str = %s\n", str);
return 0;
}
执行输出为
从输出结果看,第一个输出为乱码,另外三个输出为字符串,很容易理解,因为ca数组并没有以'\0'作为结尾,不满足字符串的概念,所以ca只是一个很普通的字符数组。
下边来看看一个有趣的问题:“Hello”这个字符串字面量代表什么?
-“Hello”是一个无名的字符数组
看一段代码,想想执行结果会是什么?
#include <stdio.h>
int main()
{
char b = "abc"[0];
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;
}
编译执行结果如下:
要理解上边的输出,我们首先来字符串字面量的一些特性:
- 字符串字面量的本质是一个数组
- 字符串字面量可以看做常量指针
- 字符串字面量的字符不可改变
- 字符串字面量至少包含一个字符
有了以上一点特性,我们就知道了,"Hello"这个字面量其实就可以看做一个常量指针,这个指针指向"Hello"这个字符串,所以"Hello"[1] == 'e', *("Hello" + 1) = 'e';现在明白以上的输出了吗?
字符串的长度:
-字符串的长度就是字符串所包含字符的个数
-字符串长度指的是第一个 '\0' 字符前出现的字符个数
-通过 '\0' 结束符来确定字符串的长度
-函数 strlen 用于返回字符串的长度
下边以一个简单的示例来展示一下
#include <stdio.h>
#include <string.h>
int main()
{
char s[] = "Hello\0world";
int i = 0;
for(i=0; i<sizeof(s)/sizeof(char); i++)
{
printf("%c\n", s[i]);
}
printf("%s\n", s);
printf( "%d\n", strlen(s) );
printf( "%d\n", strlen("123") );
return 0;
}
执行输出如下,这里需要注意的是sizeof与strlen的却别:
总结:
- C语言中通过字符数组模拟字符串
- C语言中字符串使用 '\0' 作为结束符
- 字符串字面量的本质为字符数组
- 字符串相关函数都依赖于结束符 '\0'