大家好,又见面了,我是你们的朋友全栈君。
先摆代码:
#include<stdio.h>
#include<windows.h>
int main()
{
char a[8] ; //定义数组,不设初值
char a[8] = { 'a' }; //定义数组,设置初值,这样其余为\0
scanf("%s", a); //第一种输入方式
int i = 0; //第二种输入方式
for (; i <= sizeof(a) - 1; i++)
{
char ch;
if ((ch = getchar()) == 012)break;
a[i] = ch;
}
printf("输出数组所占字节数:%d\n", sizeof(a)); //输出数组所占字节数
printf("字符串实际长度:%d\n", strlen(a)); //输出字符串实际长度,不包括\0
printf("%s\n", a); //第一种输出方式
int o = 0; //第二种输出方式
for (; o <= sizeof(a) - 1; o++)
putchar(a[o]);
printf("\nEND"); //作为结尾,便于观测
Sleep(60000);//暂停一分钟,以便观察结果
return 0;
}
TEST1.我们不设初值定义数组,再选择第一种输入方式,输入123,输出结果为:
输入1234567,再运行:
输入12345678,再运行:
但一分钟(即程序正常运行结束)后报错.
分析:不设初值定义数组,数组内应该没\0;第一种输入方式系统会自动在用户输入的内容后加上\0.所以实际向数组内赋了9个字符的值.所以报错.
第二种输出方式会将字符数组中每一个值都输出,当输入123时,数组内为123\0????,所以会出现乱码.
TEST2.我们不设初值定义数组,再选择第二种输入方式,输入123,输出结果为:
输入1234567,再运行:
输入12345678,再运行:
程序结束后没有报错.
分析:不设初值定义数组,数组内应没\0;第二种输入方式是实打实的用户输入啥便赋予数组啥.又因为strlen(a))输出字符串实际长度时在找\0,但数组中没\0,所以显示错误的数据.同理第一种输出方式在找\0没找到,所以1234567[8]后出现乱码.再说第二种输出方式,第二种输出方式会将字符数组中每一个值都输出,当输入123时,数组内为123?????,所以会出现乱码.第二种输入方式不会多加\0,所以赋了8个值,不会报错.
TEST3.我们定义数组,设初值,再选择第一种输入方式,输入123,输出结果为:
输入1234567,再运行:
输入12345678,再运行:
然后程序报错….
分析:定义数组并设初值,数组内未赋值部分会自动初始为\0;所以前两个图片都没问题.第一种输入方式系统会自动在用户输入的内容后加上\0.所以实际向数组内赋了9个字符的值.所以报错.
TEST4.我们定义数组,设初值,再选择第二种输入方式,输入123,输出结果为:
输入1234567,再运行:
输入12345678,再运行:
分析:定义数组并设初值,数组内未赋值部分会自动初始为\0;所以前两个图片都没问题.第二种输入方式是实打实的用户输入啥便赋予数组啥.又因为strlen(a))输出字符串实际长度时在找\0,但数组中八个位置都被占了,没\0,所以显示错误的数据,同理第一种输出方式在找\0没找到,所以12345678后出现乱码.
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/157546.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...