做题常常遇到和字符串相关的,发现自己对《字符串》和《字符数组》有误会,因为他们的声明太像了,我会搞混。于是我在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
请按任意键继续. . .
标签:使用,C语言,大小,数组,printf,字符串,sizeof,strlen
From: https://www.cnblogs.com/Hubugui/p/17299510.html