①第一种定义字符串变量的方式:
char 类型数组来存储。(因为c语言中没有字符串类型,只有字符串转换说明,即%s)
char arr[3] = "abc";//a[0] == 'a' 、 a[1] == 'b' 、 a[2] == 'c'
代码验证:
char arr[3] = "abc";//注意:这里的数组长度是3
int num1 = 0;
int i = 0;//索引
for(i = 0; i < 3;++i)
{
if ('\0' == arr[i])//如果有'\0',则num1加1
num1++;
}
printf("num1 = %d",num1);//输出num1的值
运行结果:
char arr[4] = "abc";//a[0] == 'a' 、 a[1] == 'b' 、 a[2] == 'c'、a[3] == '\0'
代码验证:
char arr[4] = "abc";//注意:这里的数组长度是4
int num1 = 0;
int i = 0;//索引
for(i = 0; i < 4;++i)
{
if ('\0' == arr[i])//如果有'\0',则num1加1
num1++;
}
printf("num1 = %d",num1);//输出num1的值
运行结果:
(以上是两种不一样的写法,都是正确的。)
②第二种定义字符串变量的方式:
char ch[ ] = "abc";//虽然没有写数组长度,但是它会根据你的字符串长度自动为你开辟空间。
//a[0] == 'a' 、 a[1] == 'b' 、 a[2] == 'c'、a[3] == '\0'
代码验证:
char arr[] = "abc";
int num1 = 0;
int i = 0;//索引
for(i = 0; i < 4;++i)
{
if ('\0' == arr[i])//如果有'\0',则num1加1
num1++;
}
printf("num1 = %d",num1);//输出num1的值
运行结果:
③第三种定义字符串变量的方式:
char ch[ ] = { 'a','b','c'};//也可以用%s输出
//a[0] == 'a' 、 a[1] == 'b' 、 a[2] == 'c'(这种末尾不带‘\0’)
代码验证:
char arr[] = {'a','b','c'};
int num1 = 0;
int i = 0;//索引
for(i = 0; i < 4;++i)
{
if ('\0' == arr[i])//如果有'\0',则num1加1
num1++;
}
printf("num1 = %d",num1);//输出num1的值
运行结果:
(这种末尾不带‘\0’)
(注意:如果一个字符串末尾没有\0结束标记,就会往后输出以垃圾值转化为字符的字符,解决方式:在末尾加个\0转义字符就行了,还有\0这个字符是不能显示打印的,但拆开就可以)
但是:
char ch[4] = {'a','b','c'}这种末尾是带‘\0’;
代码验证:
char arr[4] = { 'a','b','c' };
int num1 = 0;
int i = 0;//索引
for(i = 0; i < 4;++i)
{
if ('\0' == arr[i])//如果有'\0',则num1加1
num1++;
}
printf("num1 = %d",num1);//输出num1的值
运行结果:
④
char ch[ ] = "";不能用scanf()函数存入字符串,因为会使ch周围的堆栈损坏
代码验证:
char arr[] = "";
scanf("%s", arr);
printf("num1 = %s",arr);
运行结果:
但是:
同时也有两个异常信息:
上面这张图的意思是:运行时检查失败#2 -变量“arr”周围的堆栈已损坏。(内存越界访问的意思)
这种写法会导致一开始没有定义数组长度,由他自己认定数组长度为常量length,那么程序运行到结束的过程中,它的数组长度依旧是length,不会变,所以用scanf()并不会改变数组ch的长度,所以这种写法如果遇到要修改数组长度,不要写!!!
以下是有关这方面的笔记: