C语言速记5(字符串)
1,C语言中字符串是字符数组:
char site[7] = {'R', 'U', 'N', 'O', 'O', 'B', '\0'}; 或者 char site[] = "RUNOOB"; 注意: \0是null字符,用于终止该字符数组,标记字符串结束。 写入空字符结束并不是必须,因为编译器初始化会自动加入。 数组的末尾存储了空字符, 所以字符数组的大小比单词 RUNOOB 的字符数多一个
实例:
#include <stdio.h> int main () { char site[7] = {'R', 'U', 'N', 'O', 'O', 'B', '\0'}; printf("菜鸟教程: %s\n", site ); return 0; } 执行: 菜鸟教程: RUNOOB
可以看成数组名称就是字符串变量。
总结:字符串就是字符数组,但字符数组并不一定是字符串。
1,下面两个并不等价: char c[] = {'I',' ','l','o','v','e',' ','s','h','i','y','a','n','l','o','u','\0'}; 不等于: char c[] = {'I',' ','l','o','v','e',' ','s','h','i','y','a','n','l','o','u'}; 字符串都有一个\0结尾。 但有时候并不需要手动写,编译器自动完成。 下面三种都是等价的: char[] = {"I love shiyanlou"}; 可以直接省去花括号: char[] = "I love shiyanlou"; 此时数组的长度是 17,而不是 16,因为字符串常量的最后系统自动加了一个 '\0'。 char c[] = {'I',' ','l','o','v','e',' ','s','h','i','y','a','n','l','o','u','\0'};
1,下面两个并不等价: char c[] = {'I',' ','l','o','v','e',' ','s','h','i','y','a','n','l','o','u','\0'}; 不等于: char c[] = {'I',' ','l','o','v','e',' ','s','h','i','y','a','n','l','o','u'}; 字符串都有一个\0结尾。 但有时候并不需要手动写,编译器自动完成。 下面三种都是等价的: char[] = {"I love shiyanlou"}; 可以直接省去花括号: char[] = "I love shiyanlou"; 此时数组的长度是 17,而不是 16,因为字符串常量的最后系统自动加了一个 '\0'。 char c[] = {'I',' ','l','o','v','e',' ','s','h','i','y','a','n','l','o','u','\0'};
在C语言中,可以用两种方法表示和存放字符串: (1)用字符数组存放一个字符串 char str[ ]=”I love China”; (2)用字符指针指向一个字符串 char* str=”I love China”; 对于第二种表示方法,有人认为str是一个字符串变量,以为定义时把字符串常量”I love China”直接赋给该字符串变量,这是不对的。 C语言对字符串常量是按字符数组处理的,在内存中开辟了一个字符数组用来存放字符串常量,程序在定义字符串指针变量str时只是把字符串首地址(即存放字符串的字符数组的首地址)赋给str。
关于NULL和‘\0’的关系:
NULL表示未赋值,指向0地址。一般32位机器,占用4个字节。 '0'是空字符,占用一个字节, 字符实际是特定数值的ascii码。 虽然数值等于初始化为null的变量都是0,但意思不一样。 以上是两者的区别,但有时候又是意思差不多的 char c=NULL 和char c='\0' 这个时候是一样。null默认初始化会让c字符值为‘\0', 用==来判断那么他们是值相等的,但是概念来讲是不一样。 字符串是一个特殊字符数组(带’\0'结尾),中间不能有空字符,否则可能被截断,编译器只认前半段。 之前想到一个问题: 那就是字符数组,中间某个元素字符赋值为null是不是值会变成‘\0'. 出现一个警告: warning: assignment makes integer from pointer without a cast
#include<stdio.h> void main(){ char c[]="abcdef"; //c[2]='\0'; c[2]=NULL; printf("%s",c); } 也就是说NULL一般是指针类型,不能随便赋值。 NULL针对指针而言的, 在32位操作系统的内存中的表现就是0x0000 0000 0000 0000 0000 0000 0000 0000,即32位都为0,其值其实为0 所以,有 int i = 0; //让i为NULL char c = '\0'; //'\0'在内存中的表现也为一串0,等价与0和NULL 个人理解就是数值都是0,但是类型不一样, 比如short和int 同为0值时候, 实际中多数情况可以作为相同判断条件处理
补充:
C语言中空格,空字符,字符数组结束符,NULL,空字符串的区别
2,C语言库提供的一些处理字符串方法:
#include <stdio.h> #include <string.h> int main () { char str1[14] = "runoob"; char str2[14] = "google"; char str3[14]; int len ; /* 复制 str1 到 str3 */ strcpy(str3, str1); printf("strcpy( str3, str1) : %s\n", str3 ); /* 连接 str1 和 str2 */ strcat( str1, str2); printf("strcat( str1, str2): %s\n", str1 ); /* 连接后,str1 的总长度 */ len = strlen(str1); printf("strlen(str1) : %d\n", len ); return 0; } 输出: strcpy( str3, str1) : runoob strcat( str1, str2): runoobgoogle strlen(str1) : 12