鱼C论坛

 找回密码
 立即注册
查看: 1781|回复: 14

[已解决]为什么这段代码会报错,求高人指点,很短的代码

[复制链接]
发表于 2019-4-26 18:54:07 | 显示全部楼层 |阅读模式

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

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

x
  1. int main()
  2. {
  3.         FILE*fp = ("D:\a.txt", "r+");
  4.         if (!fp)
  5.                 return 0;
  6.         char ch;
  7.         ch=fgetc(fp);
  8.         char*ru[100];
  9.         ru[0] = ch;
  10.         printf("%s", ru[0]);
  11. }
复制代码

为什么这段代码会报错,求高人指点
最佳答案
2019-4-26 21:09:45
本帖最后由 wwhywhy 于 2019-4-26 21:14 编辑

fgets(ch,100, fp);
这个分号是双字节的。应该是单字节的。你敲错了。

数组ch,不应该是指针数组。只要定义成数组就成了。
把ch前的*去掉

文件操作,在win下,应该是:
FILE*fp = fopen("D:\\a.txt", "r+");
要不打不开的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-4-26 19:05:15 | 显示全部楼层
1.类型不匹配
ch是char型
ru[0]~ru[99] 都是char*

改成
        ru[0] = &ch;  

2.改成上面还是有点问题,看起来怪怪的,说出你程序要完成的任务。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-4-26 20:09:09 | 显示全部楼层
风扫地 发表于 2019-4-26 19:05
1.类型不匹配
ch是char型
ru[0]~ru[99] 都是char*

我想把一个txt里的数据一个个的通过fgetc,存到指针数组的第一个值里。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-4-26 20:24:45 | 显示全部楼层
本帖最后由 风扫地 于 2019-4-26 20:26 编辑
liu306178205 发表于 2019-4-26 20:09
我想把一个txt里的数据一个个的通过fgetc,存到指针数组的第一个值里。


存到字符数组里面就可以了,不需要存储到字符指针数组里面去。
int main()
{
        FILE*fp = fopen("D:\a.txt", "r+"); //要调用函数才能打开文件
        char ru[100] = {0,};
        int i = 0;
        int ch;
        if (!fp)
                return 0;
        
        while((ch=fgetc(fp) )!=EOF) // fgetc的返回值是int,当返回-1时表示达到文件末尾,若返回不为-1,则取低字节(小端存储时)就是读到的字符。
        {
           ru = (char)(ch);
           i++;
           if(i==98) //缓存数组只有100个字节长度,还要至少含有一个\0,所以最多存99个数就要强制跳出
           {
               break;
           }
        }

         fclose(fp);//文件用完了要关闭

        printf("%s", ru);
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-4-26 20:37:42 | 显示全部楼层
本帖最后由 wwhywhy 于 2019-4-26 20:47 编辑

问题1.
char*ru[100];变量ru只被定义但是没有被清空。其中是有随机的值的。
执行下面语句时:
printf("%s", ru);
表示的结果是显示一个字符串。
C里面字符串的结束标志是‘、0’,因为没有碰到结束符,所以这个显示的结果就是是怪异的(只有第一个是对的)。
应该在定义数组变量后,一定要初始化一下:
memset(ru, 0, sizeof(ru));

问题2:
文件的操作错误
文件打开函数:file* fp = fopen();
打开还要判断是否成功,比如文件不存在之类的:
if (!fp) return -1;

文件的关闭函数:fclose(fp);

文件的操作函数:fgetc(),fread()等。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-4-26 20:45:44 | 显示全部楼层
风扫地 发表于 2019-4-26 20:24
存到字符数组里面就可以了,不需要存储到字符指针数组里面去。
int main()
{

ru = (char)(ch);是什么意思啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-4-26 20:49:31 | 显示全部楼层
本帖最后由 wwhywhy 于 2019-4-26 21:02 编辑

char ru[100] = {0,};
int ch;
这两个的类型不同啊!
一个是char,一个是int,互相赋值的时候,当然要转换了。

应该是:
111.jpg

不知道为什么,直接输入中括号,版面显示不出来。只好用图片了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-4-26 21:02:08 | 显示全部楼层
wwhywhy 发表于 2019-4-26 20:49
char ru[100] = {0,};
int ch;
这两个的类型不同啊!
  1. FILE*fp = fopen("D:\a.txt", "r+");
  2.         if (!fp)
  3.                 return 0;
  4.         char*ch[100] = { 0 };
  5.         fgets(ch,100, fp);
  6.         printf("%s\n", ch);
复制代码

老哥再帮我看看这个,只弹框没结果
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-4-26 21:09:45 | 显示全部楼层    本楼为最佳答案   
本帖最后由 wwhywhy 于 2019-4-26 21:14 编辑

fgets(ch,100, fp);
这个分号是双字节的。应该是单字节的。你敲错了。

数组ch,不应该是指针数组。只要定义成数组就成了。
把ch前的*去掉

文件操作,在win下,应该是:
FILE*fp = fopen("D:\\a.txt", "r+");
要不打不开的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-4-26 21:16:02 | 显示全部楼层
wwhywhy 发表于 2019-4-26 21:09
fgets(ch,100, fp);
这个分号是双字节的。应该是单字节的。你敲错了。

fgets(ch; 100; fp); 这个意思吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-4-26 21:18:30 | 显示全部楼层
你写的是:
fgets(ch,100, fp)
应该是:fgets(ch,100, fp);

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

使用道具 举报

 楼主| 发表于 2019-4-26 21:25:43 | 显示全部楼层
风扫地 发表于 2019-4-26 20:24
存到字符数组里面就可以了,不需要存储到字符指针数组里面去。
int main()
{

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

使用道具 举报

 楼主| 发表于 2019-4-26 21:26:15 | 显示全部楼层
wwhywhy 发表于 2019-4-26 21:09
fgets(ch,100, fp);
这个分号是双字节的。应该是单字节的。你敲错了。

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

使用道具 举报

发表于 2019-4-26 21:30:37 | 显示全部楼层
其实文件操作有很多的细节要注意。自己多爬爬网,找些例子和函数的定义多练习就好!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-4-27 09:07:54 | 显示全部楼层
liu306178205 发表于 2019-4-26 20:45
ru = (char)(ch);是什么意思啊

类型强制转换,就是取读出来的字符。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 14:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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