main()
{
char s[100]={'\0'};
s[0]='1';
printf("%c",s[1]);
}
为什么打印s[1]不是空字符,而是'a',百思不得其解
望高手赐教
19 个解决方案
#1
s[1] == 0
#2
我表示没有输出 任何东西,只输出一个空格.你编译器是什么,会输出个'a'
#3
不对我对输出空格,到时很好奇.居然会输出空格.
#4
我觉得应该是 0 ,相当于什么都不输出,知识NULL ,但是printf("%c"),需要输出一个字符,于是输出一个空格.
#5
我运行了一遍你的代码结果什么都没有。
#6
你应该给s[1]赋值了,要不就是可能在你初始化没有成功,依然保留你原来地址的数值。你试试打印一下你的s[1]值对应的ascii码,如果输出值不为0,那就是初始化有问题,否则你要么给s[1]赋值了,要么输出的不是s[1]的值。
#7
gcc表示输出为空,连空格都没有,LZ用的什么环境?
#8
好奇楼主怎么能输出a
#9
楼主好像并没有初始化,只是初始化了s[0]而s[1]只是一个随机值。
#10
已经初始化了.这是一个字符数组.
#11
'\0' ==0==nul
unsigned char a = 0;
while(a <128)
{
printf("%d %c\t",a,a);
a++;
}
#12
我用的vc++6.0,按理说应该输出'\0'才对啊,因为我有初始化啊
#13
vc6有很多不合标准的地方。不过数组初始化列表不完整时用0初始化,应该是C89就有的吧?
#14
这个好像只能初始化0吧
#15
输出NUL我这
查阅ASCII表,首先可以看到'\0'的ASCII值是0,而对应的字符是"NUL"
char s[100]={'\0'};//数组全速全是0
s[0]='1';//第一个不是0
printf("kk %c\n",s[1]);//第二个值没有改变,依然是0,再以字符形式输出,就是"NUL"了
查阅ASCII表,首先可以看到'\0'的ASCII值是0,而对应的字符是"NUL"
char s[100]={'\0'};//数组全速全是0
s[0]='1';//第一个不是0
printf("kk %c\n",s[1]);//第二个值没有改变,依然是0,再以字符形式输出,就是"NUL"了
#16
vs2008没有问题:
输出:
#include <stdio.h>
int main()
{
char s[100]={};
char s2[100];
int i;
for( i = 0; i < 100; ++ i)
{
printf("%d ",s[i]);
}
printf("\n");
for( i = 0; i < 100; ++ i)
{
printf("%d ",s2[i]);
}
printf("\n");
return 0;
}
输出:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 -128 -3 127 0 51 69 0 -64 -2 18 0 -6 -31 35 16 -16 -2 18 0 -128 50 45 16 -31 -
119 84 126 -2 -1 -1 -1 0 -1 18 0 -44 -30 68 0 0 51 69 0 -25 80 116 110 20 21 -30
-122 -82 123 -50 1 0 -128 -3 127 0 0 0 0 32 0 0 0 -1 -1 -1 -1 4 0 0 0 12 -1 18
0 -88 -1 18 0 24 -74 65 0 111 16 35 110 -2 -1 -1 -1 12 -1 18 0
#17
s[1]是'\0'
'\0'是一个不可显示字符
你这是闹那般
人家就叫做不可显示字符了 你还要显示
结果依赖具体环境 不可靠的东西
'\0'是一个不可显示字符
你这是闹那般
人家就叫做不可显示字符了 你还要显示
结果依赖具体环境 不可靠的东西
#18
void HexDump(char *buf,int len) {
int i,j,k;
char binstr[80];
for (i=0;i<len;i++) {
if (0==(i%16)) {
sprintf(binstr,"%04x -",i);
sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
} else if (15==(i%16)) {
sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
sprintf(binstr,"%s ",binstr);
for (j=i-15;j<=i;j++) {
sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
}
printf("%s\n",binstr);
} else {
sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
}
}
if (0!=(i%16)) {
k=16-(i%16);
for (j=0;j<k;j++) {
sprintf(binstr,"%s ",binstr);
}
sprintf(binstr,"%s ",binstr);
k=16-k;
for (j=i-k;j<i;j++) {
sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
}
printf("%s\n",binstr);
}
}
电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址;
人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……
#19
不应该会输出字符'a';既然初始化了就会将字符数组s初始化为'\0';输出'a'很怪异,除非你的编译器初始化数组时只对第一个字符初始化。
#20
#1
s[1] == 0
#2
我表示没有输出 任何东西,只输出一个空格.你编译器是什么,会输出个'a'
#3
不对我对输出空格,到时很好奇.居然会输出空格.
#4
我觉得应该是 0 ,相当于什么都不输出,知识NULL ,但是printf("%c"),需要输出一个字符,于是输出一个空格.
#5
我运行了一遍你的代码结果什么都没有。
#6
你应该给s[1]赋值了,要不就是可能在你初始化没有成功,依然保留你原来地址的数值。你试试打印一下你的s[1]值对应的ascii码,如果输出值不为0,那就是初始化有问题,否则你要么给s[1]赋值了,要么输出的不是s[1]的值。
#7
gcc表示输出为空,连空格都没有,LZ用的什么环境?
#8
好奇楼主怎么能输出a
#9
楼主好像并没有初始化,只是初始化了s[0]而s[1]只是一个随机值。
#10
已经初始化了.这是一个字符数组.
#11
'\0' ==0==nul
unsigned char a = 0;
while(a <128)
{
printf("%d %c\t",a,a);
a++;
}
#12
我用的vc++6.0,按理说应该输出'\0'才对啊,因为我有初始化啊
#13
vc6有很多不合标准的地方。不过数组初始化列表不完整时用0初始化,应该是C89就有的吧?
#14
这个好像只能初始化0吧
#15
输出NUL我这
查阅ASCII表,首先可以看到'\0'的ASCII值是0,而对应的字符是"NUL"
char s[100]={'\0'};//数组全速全是0
s[0]='1';//第一个不是0
printf("kk %c\n",s[1]);//第二个值没有改变,依然是0,再以字符形式输出,就是"NUL"了
查阅ASCII表,首先可以看到'\0'的ASCII值是0,而对应的字符是"NUL"
char s[100]={'\0'};//数组全速全是0
s[0]='1';//第一个不是0
printf("kk %c\n",s[1]);//第二个值没有改变,依然是0,再以字符形式输出,就是"NUL"了
#16
vs2008没有问题:
输出:
#include <stdio.h>
int main()
{
char s[100]={};
char s2[100];
int i;
for( i = 0; i < 100; ++ i)
{
printf("%d ",s[i]);
}
printf("\n");
for( i = 0; i < 100; ++ i)
{
printf("%d ",s2[i]);
}
printf("\n");
return 0;
}
输出:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 -128 -3 127 0 51 69 0 -64 -2 18 0 -6 -31 35 16 -16 -2 18 0 -128 50 45 16 -31 -
119 84 126 -2 -1 -1 -1 0 -1 18 0 -44 -30 68 0 0 51 69 0 -25 80 116 110 20 21 -30
-122 -82 123 -50 1 0 -128 -3 127 0 0 0 0 32 0 0 0 -1 -1 -1 -1 4 0 0 0 12 -1 18
0 -88 -1 18 0 24 -74 65 0 111 16 35 110 -2 -1 -1 -1 12 -1 18 0
#17
s[1]是'\0'
'\0'是一个不可显示字符
你这是闹那般
人家就叫做不可显示字符了 你还要显示
结果依赖具体环境 不可靠的东西
'\0'是一个不可显示字符
你这是闹那般
人家就叫做不可显示字符了 你还要显示
结果依赖具体环境 不可靠的东西
#18
void HexDump(char *buf,int len) {
int i,j,k;
char binstr[80];
for (i=0;i<len;i++) {
if (0==(i%16)) {
sprintf(binstr,"%04x -",i);
sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
} else if (15==(i%16)) {
sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
sprintf(binstr,"%s ",binstr);
for (j=i-15;j<=i;j++) {
sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
}
printf("%s\n",binstr);
} else {
sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
}
}
if (0!=(i%16)) {
k=16-(i%16);
for (j=0;j<k;j++) {
sprintf(binstr,"%s ",binstr);
}
sprintf(binstr,"%s ",binstr);
k=16-k;
for (j=i-k;j<i;j++) {
sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
}
printf("%s\n",binstr);
}
}
电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址;
人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……
#19
不应该会输出字符'a';既然初始化了就会将字符数组s初始化为'\0';输出'a'很怪异,除非你的编译器初始化数组时只对第一个字符初始化。