请教fgets()读取一个整数的“玄学”问题

_lz 2018-07-16 12:03:45
各位大神们好,我是一个编程新手,最近在用《算法竞赛入门经典》(第一版)入门C语言编程。现在学到第三章数组与字符串。做练习的时候我碰到一个问题想请教一下各位,下面我就放图来描述详细问题了:


如图,我用fgets()读取一个整数到int型数组a中,
但是为什么,调试程序时显示数组a内的存储值为 667953 ? 存的不是11就算了,明显连ascii的码值都不是啊,怎么这么神奇?如下..

可能我有点小题大作了,但是刚开始学编程真的什么都想搞个一清二白,就比如这个,所以我的问题是:
到底fgets()是怎么处理这个输入的整数的?

顺便向各位大神求个建议,一开始学习编程的初学者,要不要像我这样事事刨根问底?你们建议初学者的注意力一开始放在哪里呢?
衷心希望有一日编程对我而言不再是一个“玄学”问题。
...全文
526 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2018-07-19
  • 打赏
  • 举报
回复
void HexDump(char *buf,int len,int addr) {
int i,j,k;
char binstr[80];

for (i=0;i<len;i++) {
if (0==(i%16)) {
sprintf(binstr,"%08x -",i+addr);
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);
}
}

电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址;
人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……
ForestDB 2018-07-17
  • 打赏
  • 举报
回复
667953 == 0xA3131
-858993460 == 0xCCCCCCCC
VS是有选项的,可以控制调试时显示十进制还是十六进制。
_lz 2018-07-16
  • 打赏
  • 举报
回复
引用 1 楼 Saleayas 的回复:
fget 把传入的整形数组当作字符串数组了,写入的是字符串的 "11" 加上0A 换行而已。

谢谢答复!也就是说我输入的是“11”,fgets()存储的是“11\n”,可因为我的数组设置成了int型不是char型,所以它存储的数据值就被转化成667953这样一个在计算机内部存储的整型数字,是吗?
_lz 2018-07-16
  • 打赏
  • 举报
回复
谢谢答复!也就是说我输入的是“11”,fgets()存储的是“11\n”,可因为我的数组设置成了int型不是char型,所以它存储的数据值就被转化成667953这样一个在计算机内部存储的整型数字,是吗?
Saleayas 2018-07-16
  • 打赏
  • 举报
回复
fget 把传入的整形数组当作字符串数组了,写入的是字符串的 "11" 加上0A 换行而已。
_lz 2018-07-16
  • 打赏
  • 举报
回复
引用 4 楼 qq_38319117 的回复:
fgets的默认参数是char*,你现在写的a是一个int*,有的编译器编译不过去的,会报错,原理上就是个强转
等同 fgets((char*)a, MAX,stdin);

键盘输11,在fgets看来,就是 新行'1''1' 即0x0a 0x31 0x31
然后把它放到一个四字节的int里,就变成0x0a3131,解成十进制就是667953


谢谢答复!你这样一说我就全明白了。但是我想fgets()处理的应该还是"11\n",但是估计用的是小端存放方式,所以计算成0x0a 0x31 0x31。
再说一句:非常感谢。
_肆 2018-07-16
  • 打赏
  • 举报
回复
fgets的默认参数是char*,你现在写的a是一个int*,有的编译器编译不过去的,会报错,原理上就是个强转
等同 fgets((char*)a, MAX,stdin);

键盘输11,在fgets看来,就是 新行'1''1' 即0x0a 0x31 0x31
然后把它放到一个四字节的int里,就变成0x0a3131,解成十进制就是667953

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧