C语言字符串的使用

发布时间 2023-04-08 23:08:29作者: 针眼画师

做题常常遇到和字符串相关的,发现自己对《字符串》和《字符数组》有误会,因为他们的声明太像了,我会搞混。于是我在DevC++上尝试了9种不同的声明方式,想看看什么时候才算是有效的字符串声明,都是我当前水平可能遇到的。

#include <stdio.h>
#include <string.h>
/*	解释: 
	字符串和字符数组的关系不是等价的
	他们的关系可以这样说:“字符串一定是字符数组,字符数组不一定是字符串。” ,要知道C语言没有字符串类型,只有字符类型。
	如果字符数组以\0或0结尾,则他是一个字符串。
	如果字符数组不以 \0或0结尾,则他不是一个字符串,而仅仅是一个字符数组 
*/

// 子函数用来展示字符串与字符数组的区别 
// 不指定数组大小,赋值字符而不是字符串字面量,没有\0结尾 
void test1()
{
	char words1[]={'a','b','c','d','e','0'};
	printf("数组words1[]={'a','b','c''d','e','0'}的sizeof大小是%d\n",sizeof(words1));
	printf("数组words1[]={'a','b','c''d','e','0'}的strlen大小是%d\n",strlen(words1));
	printf("按字符串输出:%s\n",words1);
	printf("数组words1的地址在%x\n",words1) ;
} 
// 不指定数组大小,赋值字符而不是字符串字面量,有\0结尾
void test2()
{
	char words2[]={'a','b','c','d','e','\0'} ;
	// 注意,这里要用转义符,否则printf()中双引号内的,字符串的输出会在\0中断,这就是\0的功能 
	printf("数组words2[]={'a','b','c''d','e','\\0'}的sizeof大小是%d\n",sizeof(words2));
	printf("数组words2[]={'a','b','c''d','e','\\0'}的strlen大小是%d\n",strlen(words2));
	printf("按字符串输出:%s\n",words2);
	printf("数组words2的地址在%x\n",words2) ;
} 
// 不指定数组大小,赋值字符串字面量
void test3()
{
	char words3[]="abcde";
	
	printf("数组words3[]=\"abcde\"的sizeof大小是%d\n",sizeof(words3));
	printf("数组words3[]=\"abcde\"的strlen大小是%d\n",strlen(words3));
	printf("按字符串输出:%s\n",words3);
	printf("数组words3的地址在%x\n",words3) ;
}
// 指定数组大小,赋值等长度的字符串字面量
void test4()
{
	char words4[6]="abcde0";
	 
	printf("数组words4[6]=\"abcde0\"的sizeof大小是%d\n",sizeof(words4));
	printf("数组words4[6]=\"abcde0\"的strlen大小是%d\n",strlen(words4));
	printf("按字符串输出:%s\n",words4);
	printf("数组words4的地址在%x\n",words4) ;
}
// 指定数组大小,赋值-1长度的字符串字面量,并且在右引号前加\0 
void test5()
{
	char words5[6]="abcde\0";
	 
	printf("数组words5[6]=\"abcde\\0\"的sizeof大小是%d\n",sizeof(words5));
	printf("数组words5[6]=\"abcde\\0\"的strlen大小是%d\n",strlen(words5));
	printf("按字符串输出:%s\n",words5);
	printf("数组words5的地址在%x\n",words5) ;
}
// 指定数组大小,赋值小于数组长度至少2的字符串字面量
void test6()
{
	char words6[6]="abcd";
	 
	printf("数组words6[6]=\"abcd\"的sizeof大小是%d\n",sizeof(words6));
	printf("数组words6[6]=\"abcd\"的strlen大小是%d\n",strlen(words6));
	printf("按字符串输出:%s\n",words6);
	printf("数组words6的地址在%x\n",words6) ;
}
// 指定数组大小,赋值小于数组长度至少2的字符变量
void test7()
{
	char words7[6]={'a','b','c','d'};
	 
	printf("数组words7[6]={'a','b','c','d'}的sizeof大小是%d\n",sizeof(words7));
	printf("数组words7[6]={'a','b','c','d'}的strlen大小是%d\n",strlen(words7));
	printf("按字符串输出:%s\n",words7);
	printf("数组words7的地址在%x\n",words7) ;
}
// 指定数组大小,不赋值
void test8()
{
	char words8[6];
	 
	printf("数组words8[6]的sizeof大小是%d\n",sizeof(words8));
	printf("数组words8[6]的strlen大小是%d\n",strlen(words8));
	printf("按字符串输出:%s\n",words8);
	printf("数组words8的地址在%x\n",words8) ;
}
// 指定数组大小,赋值0
void test9()
{
	char words9[6]={0};
	 
	printf("数组words9[6]=0的sizeof大小是%d\n",sizeof(words9));
	printf("数组words9[6]=0的strlen大小是%d\n",strlen(words9));
	printf("按字符串输出:%s\n",words9);
	printf("数组words9的地址在%x\n",words9) ;
}

// 分割线函数 
void fline()
{
	printf("==================================================\n");
}

int main()
{
	char word[]="abcde";
	
	// sizeof()能得到整个字符数组的大小,因此对于字符串,他会把\0计入 
	printf("数组word[]=\"abcde\"的sizeof大小是%d\n",sizeof(word));
	// strlen()得到的是字符串的大小,因此,他不会把字符串结尾\0计入 
	printf("数组word[]=\"abcde\"的strlen大小是%d\n",strlen(word));
	// 输出word的地址
	printf("数组word的地址在%x\n",word) ;
	
	// 分割线 
	fline();
	
	// 不指定数组大小,赋值字符而不是字符串字面量,没有\0结尾 
	// 不是字符串 ,计算strlen()会算错,按字符串输出会乱码 
	test1(); 
	fline();
	// 不指定数组大小,赋值字符而不是字符串字面量,有\0结尾
	// 是字符串 ,可以用 strlen()计算,可以按字符串输出
	test2();
	fline();
	// 不指定数组大小,赋值字字符串字面量
	// 是字符串 ,可以用 strlen()计算,可以按字符串输出
	test3();
	fline();
	// 指定数组大小,赋值等长度的字符串字面量
	// 不是字符串 ,计算strlen()会算错,按字符串输出会乱码  
	test4();
	fline();
	// 指定数组大小,赋值-1长度的字符串字面量,并且在右引号前加\0 
	// 是字符串 ,可以用 strlen()计算,可以按字符串输出
	test5();
	fline();
	// 指定数组大小,赋值小于数组长度至少2的字符串字面量
	// 是字符串 ,可以用 strlen()计算,可以按字符串输出
	test6();
	fline();
	// 指定数组大小,赋值小于数组长度至少2的字符变量
	// 是字符串 ,可以用 strlen()计算,可以按字符串输出
	test7();
	fline();
	// 指定数组大小,不赋值
	// 数组储存的是该地址原有的值,因此不确定,原来如果是字符串,那就是字符串,原来不是,那就不是 
	test8();
	fline();
	// 指定数组大小,赋值0
	// 空字符串,但是也是每个元素都为0的char型数组 
	test9();
	fline();
	
	return 0;
} 

上面是代码部分,以后搞混了不用再去写了,直接来查找就好
下面是终端的显示:

数组word[]="abcde"的sizeof大小是6
数组word[]="abcde"的strlen大小是5
数组word的地址在28feea
==================================================// 第一个子函数从这里开始,可以看输出内容,有序号
数组words1[]={'a','b','c''d','e','0'}的sizeof大小是6
数组words1[]={'a','b','c''d','e','0'}的strlen大小是10
按字符串输出:abcde0諏ev
数组words1的地址在28feba
==================================================
数组words2[]={'a','b','c''d','e','\0'}的sizeof大小是6
数组words2[]={'a','b','c''d','e','\0'}的strlen大小是5
按字符串输出:abcde
数组words2的地址在28feba
==================================================
数组words3[]="abcde"的sizeof大小是6
数组words3[]="abcde"的strlen大小是5
按字符串输出:abcde
数组words3的地址在28feba
==================================================
数组words4[6]="abcde0"的sizeof大小是6
数组words4[6]="abcde0"的strlen大小是10
按字符串输出:abcde0諏ev
数组words4的地址在28feba
==================================================
数组words5[6]="abcde\0"的sizeof大小是6
数组words5[6]="abcde\0"的strlen大小是5
按字符串输出:abcde
数组words5的地址在28feba
==================================================
数组words6[6]="abcd"的sizeof大小是6
数组words6[6]="abcd"的strlen大小是4
按字符串输出:abcd
数组words6的地址在28feba
==================================================
数组words7[6]={'a','b','c','d'}的sizeof大小是6
数组words7[6]={'a','b','c','d'}的strlen大小是4
按字符串输出:abcd
数组words7的地址在28feba
==================================================
数组words8[6]的sizeof大小是6
数组words8[6]的strlen大小是4
按字符串输出:abcd
数组words8的地址在28feba
==================================================
数组words9[6]=0的sizeof大小是6
数组words9[6]=0的strlen大小是0
按字符串输出:
数组words9的地址在28feba
==================================================

--------------------------------
Process exited after 0.4654 seconds with return value 0
请按任意键继续. . .