鱼C论坛

 找回密码
 立即注册
查看: 3418|回复: 20

gets 加指针问题。。。

[复制链接]
发表于 2015-6-17 08:07:59 | 显示全部楼层 |阅读模式
5鱼币
#include<stdio.h>
int main()
{
        struct S
        {
        int a;
        int b;
        char c[20];        //当这里为数组时,、、//当c[20]改为*c;
        struct  S *next;
        };

struct S p1,p2,*head;
printf("输入学生名\n");
gets(p1.c);               //这里成功输入“小明”,//输入过后程序就直接崩溃了,为什么?
printf("请输入数学成绩\n");
scanf("%d",&p1.a);
printf("请输入语文成绩\n");
scanf("%d",&p1.b);

printf("输入学生名\n");
gets(p2.c);                 //这里就直接跳过了,没让我输入。这是为什么
printf("请输入数学成绩\n");
scanf("%d",&p2.a);
printf("请输入语文成绩\n");
scanf("%d",&p2.b);

head=&p1;
p1.next=&p2;
p2.next=NULL;

while(head)
{
printf("%s %d   %d\n",head->c,head->a,head->b);
head=head->next;
}
}

最佳答案

查看完整内容

楼主看这句话 这句话的意思是说 gets函数会将标准输入内的第一个换行字符也包含进来, 言外之意就是默认为当出现第一个回车字符时, gets函数便终止 而当执行scanf("%d",&p1.b); 标准输入内除了b的数据, 还跟着一个回车字符, 二回车字符是啥, 就是\n (虽然是\r\n, 这个先不说) 所以换句话说, 虽然把标准输入的数据送到p1.b的内存内, 但是在标准输入内还驻留着一个不干净的'\n'字符 所以利用fflush(stdin), 将标准输入 ...
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-6-17 08:08:00 | 显示全部楼层
1.png

楼主看这句话 这句话的意思是说
gets函数会将标准输入内的第一个换行字符也包含进来, 言外之意就是默认为当出现第一个回车字符时, gets函数便终止

而当执行scanf("%d",&p1.b);
标准输入内除了b的数据, 还跟着一个回车字符, 二回车字符是啥, 就是\n (虽然是\r\n, 这个先不说)

所以换句话说, 虽然把标准输入的数据送到p1.b的内存内, 但是在标准输入内还驻留着一个不干净的'\n'字符
所以利用fflush(stdin), 将标准输入内的东西清除干净, 即可达到正常目的

楼主可以看 这是没清除的效果, c里面读入了一个空字符, 楼主你是不是想问为啥是空字符, 不是把回车字符读入进来了么
注意看刚才的截图里面有这一句
gets then replaces the newline character with a null character ('\0') before returning the line.
意思是说将回车字符包含进来同时用空字符代替
为啥要这样搞呢~不这样搞就问题大了, 因为字符串默认以空字符为结尾, 如果原封不动的包含进来不替换
那么这个字符串除非遇到接下来在内存中第一个空字符才会停止!

ps:我是来骗鱼币的 纯手打
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-6-17 08:32:36 | 显示全部楼层
我说你这写的链表不像链表数组不像数组的到底是个什么玩意??
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-6-17 08:33:23 | 显示全部楼层
至于你说的问题  改成 char *c; 后
输入用        scanf("%s",&p1.c ); 就应该没问题了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-6-17 08:49:47 | 显示全部楼层
#include<stdio.h>
int main()
{
        struct S
        {
                int a;
                int b;
                char c[20];        //当这里为数组时,、、//当c[20]改为*c;
                struct  S *next;
        };

        struct S p1,p2,*head;
        printf("输入学生名\n");
        gets(p1.c);               //这里成功输入“小明”,//输入过后程序就直接崩溃了,为什么?
        printf("请输入数学成绩\n");
        scanf("%d",&p1.a);
        printf("请输入语文成绩\n");
        scanf("%d",&p1.b);

        fflush(stdin);
        printf("输入学生名\n");
        gets(p2.c);                 //这里就直接跳过了,没让我输入。这是为什么?
        printf("请输入数学成绩\n");
        scanf("%d",&p2.a);
        printf("请输入语文成绩\n");
        scanf("%d",&p2.b);

        head=&p1;
        p1.next=&p2;
        p2.next=NULL;

        while(head)
        {
                printf("%s %d   %d\n",head->c,head->a,head->b);
                head=head->next;
        }
}
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-6-17 09:09:26 | 显示全部楼层
帮你改了下~~
  1. #include<stdio.h>
  2. #include<malloc.h>
  3. int n = 0;
  4. struct S
  5.         {
  6.         char name[20];
  7.                 int num;
  8.         struct  S *next;
  9.         }*head,*p1,*p2;
  10. int main()
  11. {
  12.         int i;
  13.         char ch;
  14.         head = (struct S*)malloc(sizeof(struct S));
  15.         p1 = head;
  16. s:        printf("Please Input your name:");
  17.         scanf("%s",&p1->name );
  18.         printf("Pleas Input your num:");
  19.         scanf("%d,",&p1->num);
  20.         while((ch = getchar())!='\n');
  21.         if(p1->num  != 0)
  22.         {
  23.                 n++;
  24.                 p2 = (struct S*)malloc(sizeof(struct S));
  25.                 p1->next = p2;
  26.                 p1 = p2;
  27.                 goto s;
  28.         }
  29.         else
  30.         {
  31.                 p1->next =NULL;
  32.         }

  33.         printf("你一共输入了%d个名字!\n",n);

  34.         p1 = head;
  35.         i = 1;

  36.         while(p1->next != NULL)
  37.         {
  38.                 printf("%d: name:%s num: %d\n",i,&p1->name,p1->num  );
  39.                 i++;
  40.                 p1 = p1->next ;
  41.         }




  42.         /*
  43.         printf("输入学生名\n");
  44.         scanf("%s",&p1.c );//gets(p1.c);               //这里成功输入“小明”,//输入过后程序就直接崩溃了,为什么?
  45.         printf("请输入数学成绩\n");
  46.         scanf("%d",&p1.a);
  47.         printf("请输入语文成绩\n");
  48.         scanf("%d",&p1.b);
  49.        
  50.         printf("输入学生名\n");
  51.         scanf("%s",&p2.c );//gets(p2.c);                 //这里就直接跳过了,没让我输入。这是为什么?
  52.         printf("请输入数学成绩\n");
  53.         scanf("%d",&p2.a);
  54.         printf("请输入语文成绩\n");
  55.         scanf("%d",&p2.b);
  56.        
  57.         head=&p1;
  58.         p1.next=&p2;
  59.         p2.next=NULL;
  60.        
  61.         while(head!=NULL)
  62.         {
  63.                 printf("%s %d   %d\n",head->c,head->a,head->b);
  64.                 head=head->next;
  65.         }*/
  66. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-6-17 09:10:35 | 显示全部楼层

fflush(stdin); 不建议使用
只是清空的话
还是
  1. char ch;
  2. while((ch = getchar)!='\n');
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-6-17 09:11:17 | 显示全部楼层
哦 对了 楼主 还少看了一个问题
你问为啥char[20]换成char* 输入就崩溃了对吧
这样如果都不崩溃, 那就出大问题了

且听我慢慢道来

char[20]
这个干了啥 这个在内存空间了开辟了一个大小为20字节的内存空间
换句话说, 内存上已经有空间了, 直接往里面写数据就可以了, 不要超过大小即可
小鱼老师讲 no picture you say a 那个啥
看图
1.jpg

char* c
这个干了啥
这个在上开辟了一个4字节的内空间
他应该存放一个地址, 即你已经开辟好的内存空间上的地址, 告诉他往哪里写, 但是呢, 你并没有这么做, 直接啪啪啪就往里写数据, 内存自然报错
这个就是俗称的野指针, 即定义了指针并没有初始化即使用
可以考虑
char* c = (malloc)malloc(20 *sizeof(char) );
这样在堆上开辟了20个字节的空间
然后就可以啪啪啪的往里写数据了



纯手打 骗鱼币
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-6-17 09:11:20 | 显示全部楼层

顺带一提

   gets(p1.c);   
目测程序会出错的    没试过 (*^__^*) 嘻嘻……
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-6-17 09:12:16 | 显示全部楼层
牡丹花下死做鬼 发表于 2015-6-17 09:11
顺带一提

   gets(p1.c);   

妥妥的不会出错 刚试过
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-6-17 09:13:28 | 显示全部楼层
ryxcaixia 发表于 2015-6-17 09:12
妥妥的不会出错 刚试过

换成 char*不会出错 不可能吧????
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-6-17 09:14:51 | 显示全部楼层
牡丹花下死做鬼 发表于 2015-6-17 09:13
换成 char*不会出错 不可能吧????

子非鱼焉知鱼之乐 请循其本
亲~请看楼主贴的代码~char*在注释里乖乖的躺着
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-6-17 09:15:46 | 显示全部楼层
ryxcaixia 发表于 2015-6-17 09:14
子非鱼焉知鱼之乐 请循其本
亲~请看楼主贴的代码~char*在注释里乖乖的躺着

好吧 ~~~没仔细看
我看了下就一个感觉 数组不像数组 链表不像链表~~~
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-6-18 11:03:35 | 显示全部楼层
牡丹花下死做鬼 发表于 2015-6-17 08:33
至于你说的问题  改成 char *c; 后
输入用        scanf("%s",&p1.c ); 就应该没问题了

是啊!我知道!我就只是单纯的想知道!为什么那样会错而已!为什么?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-6-18 11:09:10 | 显示全部楼层
牡丹花下死做鬼 发表于 2015-6-17 09:15
好吧 ~~~没仔细看
我看了下就一个感觉 数组不像数组 链表不像链表~~~

本来就是纯属瞎搞!!!!!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-6-18 11:11:55 | 显示全部楼层

棒棒哒!!!!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-6-18 11:12:27 | 显示全部楼层
ryxcaixia 发表于 2015-6-17 09:11
哦 对了 楼主 还少看了一个问题
你问为啥char[20]换成char* 输入就崩溃了对吧
这样如果都不崩溃, 那就出 ...

原来如此
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-6-18 11:16:37 | 显示全部楼层
牡丹花下死做鬼 发表于 2015-6-17 09:10
fflush(stdin); 不建议使用
只是清空的话
还是

为什么不建议使用fflush(stdin)呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-8-1 09:07:34 | 显示全部楼层
牡丹花下死做鬼 发表于 2015-6-17 09:11
顺带一提

   gets(p1.c);   

牡丹当初为什么会认为这样写会出错呢?
这个程序是过了,但我又写了一个和这个相似的程序!   没过!
原因还是,能编译过!调试时,整个程序能正常运行完!
执行时,程序就崩溃了!找了下原因,把程序中关于这段的注释掉!就正常运行!
想过解决方案!用scanf也不行!已经崩溃了!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-8-1 09:27:52 | 显示全部楼层
牡丹花下死做鬼 发表于 2015-6-17 09:11
顺带一提

   gets(p1.c);   

神奇的问题!编译过,调试过,执行时就崩溃!我内心已然崩溃!!
http://bbs.fishc.com/thread-63557-1-1.html
(出处: 鱼C论坛)
手残的我,居然点了已解决!内心再次崩溃!剁手剁手。。。。。!这个还能改成未解决吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-21 08:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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