鱼C论坛

 找回密码
 立即注册
查看: 911|回复: 9

[已解决]C语言

[复制链接]
发表于 2020-4-20 21:23:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include<stdio.h>
#include<stdlib.h>
int main()
{
    FILE *fp;
    int k,n,a[6] = {1,2,3,4,5,6};
    fp = fopen("d2.dat","w");
    fprintf(fp,"%d%d%d\n",a[0],a[1],a[2]);
    fprintf(fp,"%d%d%d\n",a[3],a[4],a[5]);      //这两行代码将123456,输入fp
    fclose(fp);
    fp = fopen("d2.dat","r");
    fscanf(fp,"%d%d",&k,&n);                    //按照我之前问的说是遇到\0停止,\n只是换行,那么应该是将fp里的123456全部输出到k变量里??
    printf("%d%d\n",k,n);                       //之后我试了一下只输出k,只输出了123,所以是fscanf输出时遇到\0或\n都会停止吗??
    fclose(fp);
    return 0;
}
最佳答案
2020-4-20 22:33:16
\0结束是针对%s来说的,而这里是%d。

将123456写入fp后,文件内容是这样的:
123
456

%d输入整数时遇到非数字结束,123后面是\n(不是数字), 读取结束, 所以k的值是123
%d也会跳过开头的空白(空格, \t, \n), 所以下一个%d读n时, 跳过\n, 读取456结束, n的值是456
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-20 22:33:16 | 显示全部楼层    本楼为最佳答案   
\0结束是针对%s来说的,而这里是%d。

将123456写入fp后,文件内容是这样的:
123
456

%d输入整数时遇到非数字结束,123后面是\n(不是数字), 读取结束, 所以k的值是123
%d也会跳过开头的空白(空格, \t, \n), 所以下一个%d读n时, 跳过\n, 读取456结束, n的值是456
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-21 00:11:14 | 显示全部楼层
本帖最后由 jkluoling1992 于 2020-4-21 00:16 编辑

fprintf 输入1,2,3 分别到文件中,然后在输入一个换行符
然后在输入4,5,6分别到文件中,再输入一个换行符,
,fscanf遇到空格和换行时结束
fscanf是把这些文件中的两行数字分别赋给了k,n,因为遇到换行符就结束了,所以赋值的时候就把123(连续地址)赋给了&k指向的地址空间,把456(也是连续地址)赋给了&n指向的地址空间,所以最后看到的不是k=123456
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-21 08:47:14 | 显示全部楼层
jkluoling1992 发表于 2020-4-21 00:11
fprintf 输入1,2,3 分别到文件中,然后在输入一个换行符
然后在输入4,5,6分别到文件中,再输入一个换 ...

刚试了一下,好像你是对的... 最佳答案给错人了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-21 08:48:11 | 显示全部楼层
superbe 发表于 2020-4-20 22:33
\0结束是针对%s来说的,而这里是%d。

将123456写入fp后,文件内容是这样的:

那按照你说的,我将\n换成n,之后发现值会改变
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-21 08:50:26 | 显示全部楼层
老牛来学习 发表于 2020-4-21 08:47
刚试了一下,好像你是对的... 最佳答案给错人了

哈哈哈,没事,就当共同学习咯
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-4-21 15:08:57 | 显示全部楼层
本帖最后由 superbe 于 2020-4-21 15:10 编辑

第8行 fprintf(fp,"%d%d%d\n",a[0],a[1],a[2]);
你把第8行的 \n 换成 n 了?是不是k的值没变还是123,但n的值不对了?
k读到字符n就结束了,所以是123,而读n的值是不能跳过字符n,读取失败,n的值是无效的值。
和我上面说的不矛盾吧。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-21 15:23:36 | 显示全部楼层
superbe 发表于 2020-4-21 15:08
第8行 fprintf(fp,"%d%d%d\n",a[0],a[1],a[2]);
你把第8行的 \n 换成 n 了?是不是k的值没变还是123,但n ...

确实之后试了一下,单独输出k是正常的,但是为啥百度都是说遇到空格和\n结束.。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-21 16:17:55 | 显示全部楼层
本帖最后由 superbe 于 2020-4-21 16:19 编辑

正常输入时我们经常用空格隔开每个数,或者是每个数后面一个回车。这是不出错的情况,所以可以说遇到空格和\n结束。
但有时要考虑非法输入,例如整数输入的是123abc,整数得到值123,把后面的abc留在缓冲区,如果不清除掉,后面输入别的数就不正确。
所以说%d是遇到非数字就结束,这包括了遇到空格和\n的情况。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-21 16:33:26 | 显示全部楼层
superbe 发表于 2020-4-21 16:17
正常输入时我们经常用空格隔开每个数,或者是每个数后面一个回车。这是不出错的情况,所以可以说遇到空格和 ...

感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-14 18:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表