鱼C论坛

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

[已解决]新手求助!!

[复制链接]
发表于 2020-3-26 17:53:31 | 显示全部楼层 |阅读模式

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

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

x
为什么第二个scanf还没输入程序就结束了?
[图片]

#include<stdio.h>
#include<stdlib.h>
#define LEN sizeof(struct Student)
struct Student
{
  long num;
  float score;
  struct Student *next;
};
int n;
struct Student *creat(void)
{
  struct Student *head;//头指针是必须的啊
  struct Student *p1,*p2;//
  n=0;
  p1=p2=(struct Student *)malloc(LEN);//使用指针之前必须要让ta有指向,即开辟一个空间
  scanf("%1d,%f",&p1->num,&p1->score);
  head=NULL;
  while(p1->num!=0)
  {
    n=n+1;//表示第一个结点
        if(n==1)
                head=p1;//把头指向第一个结点
        else p2->next=p1;
        p2=p1;
        p2=p1=(struct Student *)malloc(LEN);
        scanf("%1d,%f",&p1->num,&p1->score);
  }
  p2->next=NULL;
  return(head);

}
int main()
{
  struct Student *pt;
  pt=creat();
  printf("\nnum:%1d\nscore:%5.1f\n",pt->num,pt->score);
  return 0;
}
最佳答案
2020-3-26 21:10:39
你的程序错误是由于敲代码的时候粗心导致的
scanf中第一个%后面你洗的是1d,应该是ld,你把字母l写成数字1了
%1d意思是读取一位整数,%ld才是读取一个长整型

当然楼上几位说的也很好,scanf中尽量不要有其他字符,两个格式化符号完全可以直接挨着,反正输入的时候是需要用空白符来表示一个数据的结束的
scanf("%ld%f",&p1->num,&p1->score);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-26 17:59:40 | 显示全部楼层
首先,scanf中用逗号可不是好习惯,最好什么都不用
在输入流中还有你之前输入的回车(或者空格),就是上一个结束scanf遗留的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-26 18:14:14 | 显示全部楼层
BngThea 发表于 2020-3-26 17:59
首先,scanf中用逗号可不是好习惯,最好什么都不用
在输入流中还有你之前输入的回车(或者空格),就是上 ...

为什么有些scaf有可以用呢?这么vc++的一个bug吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-26 18:26:52 | 显示全部楼层
BngThea 发表于 2020-3-26 17:59
首先,scanf中用逗号可不是好习惯,最好什么都不用
在输入流中还有你之前输入的回车(或者空格),就是上 ...

大佬!!为什么我第一次输入的score是67.5,然而输出的p1->score却是1.000呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-26 18:44:36 | 显示全部楼层
hsk123456 发表于 2020-3-26 18:26
大佬!!为什么我第一次输入的score是67.5,然而输出的p1->score却是1.000呢?

你先把scanf中的逗号去掉,用空格执行两次输入
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-26 18:56:50 | 显示全部楼层
你的申请内存空间
p1 = p2 = malloc(struct Student *)malloc(LEN)
是啥意思,你是想申请一个内存空间用两个指针指向它,还是想申请两个内存空间
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-26 19:06:06 | 显示全部楼层
就是要努力呀 发表于 2020-3-26 18:56
你的申请内存空间

是啥意思,你是想申请一个内存空间用两个指针指向它,还是想申请两个内存空间

申请一个内存空间。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-26 19:07:21 | 显示全部楼层
BngThea 发表于 2020-3-26 18:44
你先把scanf中的逗号去掉,用空格执行两次输入

我把scanf里的逗号去掉了,用空格来代替之后是能多次输入了,但p1->score还是1.000
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-26 19:13:38 | 显示全部楼层
hsk123456 发表于 2020-3-26 19:07
我把scanf里的逗号去掉了,用空格来代替之后是能多次输入了,但p1->score还是1.000

你在第一个scanf后面printf一下先看看是不是你输入的值,如果是,证明循环体里的操作有问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-26 19:24:24 | 显示全部楼层
hsk123456 发表于 2020-3-26 19:06
申请一个内存空间。

那你为啥要用两个指针指向它
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-26 21:10:39 | 显示全部楼层    本楼为最佳答案   
你的程序错误是由于敲代码的时候粗心导致的
scanf中第一个%后面你洗的是1d,应该是ld,你把字母l写成数字1了
%1d意思是读取一位整数,%ld才是读取一个长整型

当然楼上几位说的也很好,scanf中尽量不要有其他字符,两个格式化符号完全可以直接挨着,反正输入的时候是需要用空白符来表示一个数据的结束的
scanf("%ld%f",&p1->num,&p1->score);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-26 22:16:09 | 显示全部楼层
就是要努力呀 发表于 2020-3-26 19:24
那你为啥要用两个指针指向它

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

使用道具 举报

 楼主| 发表于 2020-3-26 22:18:21 | 显示全部楼层
sunrise085 发表于 2020-3-26 21:10
你的程序错误是由于敲代码的时候粗心导致的
scanf中第一个%后面你洗的是1d,应该是ld,你把字母l写成数字1 ...

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

使用道具 举报

 楼主| 发表于 2020-3-26 22:26:12 | 显示全部楼层
sunrise085 发表于 2020-3-26 21:10
你的程序错误是由于敲代码的时候粗心导致的
scanf中第一个%后面你洗的是1d,应该是ld,你把字母l写成数字1 ...

啊!你看得好认真啊!!真的是我粗心了!修改成ld之后就行了!!感谢感谢啊!!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-26 22:27:37 | 显示全部楼层
BngThea 发表于 2020-3-26 18:44
你先把scanf中的逗号去掉,用空格执行两次输入

scanf中第一个%后面我写成1d,应该是ld,改完这个就能正确输出了。谢谢你啦!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-15 17:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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