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值时候, 实际中多数情况可以作为相同判断条件处理

 补充:

处理中间含有空字符‘\0’的char型字符串注意的问题

空字符 空格字符(字符) 空字符串 NULL的区别

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

 

posted @ 2021-05-18 18:34  假程序猿  阅读(334)  评论(0编辑  收藏  举报