现在的我 发表于 2015-6-17 08:07:59

gets 加指针问题。。。

#include<stdio.h>
int main()
{
        struct S
        {
        int a;
        int b;
        char c;      //当这里为数组时,、、//当c改为*c;
        structS *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;
}
}

ryxcaixia 发表于 2015-6-17 08:08:00



楼主看这句话 这句话的意思是说
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:我是来骗鱼币的 纯手打
{:9_217:} {:9_217:} {:9_217:} {:9_217:} {:9_217:} {:9_217:} {:9_217:} {:9_217:} {:9_217:}

牡丹花下死做鬼 发表于 2015-6-17 08:32:36

我说你这写的链表不像链表数组不像数组的到底是个什么玩意??

牡丹花下死做鬼 发表于 2015-6-17 08:33:23

至于你说的问题改成 char *c; 后
输入用        scanf("%s",&p1.c ); 就应该没问题了

ryxcaixia 发表于 2015-6-17 08:49:47

#include<stdio.h>
int main()
{
        struct S
        {
                int a;
                int b;
                char c;      //当这里为数组时,、、//当c改为*c;
                structS *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;
        }
}

牡丹花下死做鬼 发表于 2015-6-17 09:09:26

帮你改了下~~
#include<stdio.h>
#include<malloc.h>
int n = 0;
struct S
        {
      char name;
                int num;
      structS *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;
        }*/
}

牡丹花下死做鬼 发表于 2015-6-17 09:10:35

ryxcaixia 发表于 2015-6-17 08:49
#include
int main()
{


fflush(stdin); 不建议使用
只是清空的话
还是
char ch;
while((ch = getchar)!='\n');

ryxcaixia 发表于 2015-6-17 09:11:17

哦 对了 楼主 还少看了一个问题
你问为啥char换成char* 输入就崩溃了对吧
这样如果都不崩溃, 那就出大问题了

且听我慢慢道来

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


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

{:9_217:} {:9_217:} {:9_217:} {:9_217:} {:9_217:} {:9_217:} {:9_217:} {:9_217:} {:9_217:}

纯手打 骗鱼币

牡丹花下死做鬼 发表于 2015-6-17 09:11:20

ryxcaixia 发表于 2015-6-17 08:49
#include
int main()
{


顺带一提

   gets(p1.c);   
目测程序会出错的    没试过 (*^__^*) 嘻嘻……

ryxcaixia 发表于 2015-6-17 09:12:16

牡丹花下死做鬼 发表于 2015-6-17 09:11
顺带一提

   gets(p1.c);   


妥妥的不会出错 刚试过

牡丹花下死做鬼 发表于 2015-6-17 09:13:28

ryxcaixia 发表于 2015-6-17 09:12
妥妥的不会出错 刚试过

换成 char*不会出错 不可能吧????

ryxcaixia 发表于 2015-6-17 09:14:51

牡丹花下死做鬼 发表于 2015-6-17 09:13
换成 char*不会出错 不可能吧????

子非鱼焉知鱼之乐 请循其本
亲~请看楼主贴的代码~char*在注释里乖乖的躺着

牡丹花下死做鬼 发表于 2015-6-17 09:15:46

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

好吧 ~~~没仔细看
我看了下就一个感觉 数组不像数组 链表不像链表~~~

现在的我 发表于 2015-6-18 11:03:35

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

是啊!我知道!我就只是单纯的想知道!为什么那样会错而已!为什么?

现在的我 发表于 2015-6-18 11:09:10

牡丹花下死做鬼 发表于 2015-6-17 09:15
好吧 ~~~没仔细看
我看了下就一个感觉 数组不像数组 链表不像链表~~~

{:9_237:}本来就是纯属瞎搞!!!!!

现在的我 发表于 2015-6-18 11:11:55

牡丹花下死做鬼 发表于 2015-6-17 09:09
帮你改了下~~

{:9_232:}棒棒哒!!!!

现在的我 发表于 2015-6-18 11:12:27

ryxcaixia 发表于 2015-6-17 09:11
哦 对了 楼主 还少看了一个问题
你问为啥char换成char* 输入就崩溃了对吧
这样如果都不崩溃, 那就出 ...

{:9_240:}原来如此

现在的我 发表于 2015-6-18 11:16:37

牡丹花下死做鬼 发表于 2015-6-17 09:10
fflush(stdin); 不建议使用
只是清空的话
还是

为什么不建议使用fflush(stdin)呢?

现在的我 发表于 2015-8-1 09:07:34

牡丹花下死做鬼 发表于 2015-6-17 09:11
顺带一提

   gets(p1.c);   


牡丹{:9_221:}当初为什么会认为这样写会出错呢?
这个程序是过了,但我又写了一个和这个相似的程序!   没过!
原因还是,能编译过!调试时,整个程序能正常运行完!
执行时,程序就崩溃了!找了下原因,把程序中关于这段的注释掉!就正常运行!
想过解决方案!用scanf也不行!{:9_220:}已经崩溃了!

现在的我 发表于 2015-8-1 09:27:52

牡丹花下死做鬼 发表于 2015-6-17 09:11
顺带一提

   gets(p1.c);   


神奇的问题!编译过,调试过,执行时就崩溃!我内心已然崩溃!!
http://bbs.fishc.com/thread-63557-1-1.html
(出处: 鱼C论坛)
{:9_230:}手残的我,居然点了已解决!内心再次崩溃!剁手剁手。。。。。!这个还能改成未解决吗?
页: [1] 2
查看完整版本: gets 加指针问题。。。