鱼C论坛

 找回密码
 立即注册
查看: 3022|回复: 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), 将标准输入 ...
想知道小甲鱼最近在做啥?请访问 -> 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:我是来骗鱼币的 纯手打
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-6-17 08:32:36 | 显示全部楼层
我说你这写的链表不像链表数组不像数组的到底是个什么玩意??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-6-17 08:33:23 | 显示全部楼层
至于你说的问题  改成 char *c; 后
输入用        scanf("%s",&p1.c ); 就应该没问题了
想知道小甲鱼最近在做啥?请访问 -> 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;
        }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-6-17 09:09:26 | 显示全部楼层
帮你改了下~~
#include<stdio.h>
#include<malloc.h>
int n = 0;
struct S
        {
        char name[20];
                int num;
        struct  S *next;
        }*head,*p1,*p2;
int main()
{
        int i;
        char ch;
        head = (struct S*)malloc(sizeof(struct S));
        p1 = head;
s:        printf("Please Input your name:");
        scanf("%s",&p1->name );
        printf("Pleas Input your num:");
        scanf("%d,",&p1->num);
        while((ch = getchar())!='\n');
        if(p1->num  != 0)
        {
                n++;
                p2 = (struct S*)malloc(sizeof(struct S));
                p1->next = p2;
                p1 = p2;
                goto s;
        }
        else
        {
                p1->next =NULL;
        }

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

        p1 = head;
        i = 1;

        while(p1->next != NULL)
        {
                printf("%d: name:%s num: %d\n",i,&p1->name,p1->num  );
                i++;
                p1 = p1->next ;
        }




        /*
        printf("输入学生名\n");
        scanf("%s",&p1.c );//gets(p1.c);               //这里成功输入“小明”,//输入过后程序就直接崩溃了,为什么?
        printf("请输入数学成绩\n");
        scanf("%d",&p1.a);
        printf("请输入语文成绩\n");
        scanf("%d",&p1.b);
        
        printf("输入学生名\n");
        scanf("%s",&p2.c );//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!=NULL)
        {
                printf("%s %d   %d\n",head->c,head->a,head->b);
                head=head->next;
        }*/
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

fflush(stdin); 不建议使用
只是清空的话
还是
char ch;
while((ch = getchar)!='\n');
想知道小甲鱼最近在做啥?请访问 -> 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个字节的空间
然后就可以啪啪啪的往里写数据了



纯手打 骗鱼币
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

顺带一提

   gets(p1.c);   
目测程序会出错的    没试过 (*^__^*) 嘻嘻……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

   gets(p1.c);   

妥妥的不会出错 刚试过
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

换成 char*不会出错 不可能吧????
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

子非鱼焉知鱼之乐 请循其本
亲~请看楼主贴的代码~char*在注释里乖乖的躺着
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

好吧 ~~~没仔细看
我看了下就一个感觉 数组不像数组 链表不像链表~~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

是啊!我知道!我就只是单纯的想知道!为什么那样会错而已!为什么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本来就是纯属瞎搞!!!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

棒棒哒!!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

原来如此
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

为什么不建议使用fflush(stdin)呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

   gets(p1.c);   

牡丹当初为什么会认为这样写会出错呢?
这个程序是过了,但我又写了一个和这个相似的程序!   没过!
原因还是,能编译过!调试时,整个程序能正常运行完!
执行时,程序就崩溃了!找了下原因,把程序中关于这段的注释掉!就正常运行!
想过解决方案!用scanf也不行!已经崩溃了!
想知道小甲鱼最近在做啥?请访问 -> 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论坛)
手残的我,居然点了已解决!内心再次崩溃!剁手剁手。。。。。!这个还能改成未解决吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-26 11:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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