C中哪些⽅式定义的字符串,其末尾会⾃动添加‘0’
⼀、‘\0’ 的本质:
'\0'就是8位的00000000,因为字符类型中并没有对应的这个字符,所以这么写。'\0'就是 字符串结束标志。
'\0'是转译字符,意思是告诉编译器,这不是字符0,⽽是空字符。空字符\0对应的⼆进制为00000000,⽽数字0为00110000
原来,在C语⾔中没有专门的字符串变量,通常⽤⼀个字符数组来存放⼀个字符串。字符串总是以'\0'作为串的结束符。因此当把⼀个字符串存⼊⼀个数组时,也把结束符 '\0'存⼊数组,并以此作为该字符串是否结束的标志。有了'\0'标志后,就不必再⽤字符数组的长度来判断字符串的长度了。
‘\0’:即空字符,在c语⾔中,字符是按其所对应的ASCII码来存储的,⼀个字符占⼀个字节。ASCII码表如下:
Bin
(⼆进制)Oct
(⼋进制)
Dec
(⼗进制)
Hex
(⼗六进制)
缩写/字符解释
0000 00000000x00NUL(null)
空字符
字符串结束标志为‘\0’
判断⼀个字符串是否结束的标志就是看是否遇到‘\0’,如果遇到‘\0’,则表⽰字符串结束。
⼆、字符串定义⽅法:
1、字符数组:
(1)、char str[]="12345";
或给字符串加上⼤括号:char str[]={"12345"};
或 char str[6]="12345"
这种⽅法定义时,系统会⾃动在字符串的末尾加上字符串结束符,即 ‘\0’,
(2)、char str[10]={'1','2','3','4','5'};
这种⽅法定义时,系统会⾃动从未初始化的元素开始,将之后的元素赋为\0,如上⾯的数组str中的元素实际上
是:'1','2','3','4','5','\0','\0','\0','\0','\0'
(3)、char str[]={'1','2','3','4','5'};
这种⽅法定义时,系统不会⾃动在字符串的末尾加上字符串结束符;
此时⽤sizeof()函数可以正确求出其所占的内存⼤⼩;但⽤strlen()函数不能正确求出其长度,因为strlen是通过\0判断字符串结束的。所以,采⽤该⽅法定义时,⼀般⼈为地加上\0,即char str[]={'1','2','3','4','5', '\0'};
既:
char str[]={'1','2','3','4','5', '\0'};
char str[6]={'1','2','3','4','5'}; //故意给数组预留⼀个空位
char str[]={“12345”};
代码⽰例:
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
char str1[] = "12345";
char str2[10] = { '1','2','3','4','5' };
const char *str3 = "12345";
char str4[] = { '1','2','3','4','5',0 };
char str5[] = { '1','2','3','4','5' };
printf("%d,%d,%d,%d,%d,%d\n", str2[5], str2[6], str2[7], str2[8], str2[9], str3[4]);
printf("各个字符串为:%s,%s,%s,%s,%s\n", str1, str2, str3, str4, str5);
printf("各个字符串的所占的内存⼤⼩为:%d,%d,%d,%d,%d\n", sizeof(str1), sizeof(str2), sizeof(str3), sizeof(str4), sizeof(str5)); printf("各个字符串的有效长度为:%d,%d,%d,%d,%d\n", strlen(str1), strlen(str2), strlen(str3), strlen(str4), strlen(str5));
printf("%d\n", strcmp(str1, str3));
printf("%d\n", strcmp(str1, str5));
return 0;
}
运⾏结果:
2、字符指针
只能采⽤字符串的⽅式初始化:char *str3="12345";
注意:字符指针可以⽤字符串常量初始化和赋值;
即:char *str3;str3="12345";也是可以的
此时也可以⽤str3[4]的形式访问其中的元素,如cout<< str3[4];就会输出str指向的字符串的第四个元素。
该⽅法也是⾃动加上了字符串结束符的。
三、C语⾔中,利⽤宏定义⼀个字符串和字符数组,定义的字符串其末尾都会⾃动添加 ‘\0’ 字符吗?
答案是:会⾃动添加‘\0’,⽤程序进⾏验证:
#include <stdio.h>
#define MYPHONE "AT+CMGS"
unsigned char SMS[] = "HELLO, WELCOME TO RCCTS!";
unsigned char *String;
unsigned char i = 0;
void main()
{
printf("**************this procedure is to confirm \\0 's exist****************\n");
/********************************验证MYPHONE字符串末尾是否有\0字符*************************/
String = MYPHONE;
while (*String)              //当*String所指向的字符等于\0时跳出循环
{
i = *String;
printf("%c", i);
String++;
数组定义时初始化
}
if (*String == '\0') {          //再次确认字符串的末尾是否有\0字符存在
printf("\\0");          //有则打印出来
}
else {
printf("**");          //没有则打印**
}
printf("\n");
printf("MYPHONE=%s\n", &MYPHONE);          //打印字符串这⾥%s的s必须为⼩写
/**************验证SMS字符串末尾是否有\0字符****************/
String = SMS;
while (*String)              //当*String所指向的字符等于\0时跳出循环
{
i = *String;
printf("%c", i);
String++;
}
if (*String == '\0') {          //再次确认字符串的末尾是否有\0字符存在
printf("\\0");          //有则打印出来
}
else {
printf("**");          //没有则打印**
}
printf("\nSMS=%s\n", &SMS);          //打印字符串这⾥%s的s必须为⼩写
}
运⾏结果:
参考链接:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。