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;
}
}
楼主看这句话 这句话的意思是说
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:} 我说你这写的链表不像链表数组不像数组的到底是个什么玩意?? 至于你说的问题改成 char *c; 后
输入用 scanf("%s",&p1.c ); 就应该没问题了 #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;
}
} 帮你改了下~~
#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;
}*/
} ryxcaixia 发表于 2015-6-17 08:49
#include
int main()
{
fflush(stdin); 不建议使用
只是清空的话
还是
char ch;
while((ch = getchar)!='\n'); 哦 对了 楼主 还少看了一个问题
你问为啥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:}
纯手打 骗鱼币 ryxcaixia 发表于 2015-6-17 08:49
#include
int main()
{
顺带一提
他
gets(p1.c);
目测程序会出错的 没试过 (*^__^*) 嘻嘻…… 牡丹花下死做鬼 发表于 2015-6-17 09:11
顺带一提
他
gets(p1.c);
妥妥的不会出错 刚试过 ryxcaixia 发表于 2015-6-17 09:12
妥妥的不会出错 刚试过
换成 char*不会出错 不可能吧???? 牡丹花下死做鬼 发表于 2015-6-17 09:13
换成 char*不会出错 不可能吧????
子非鱼焉知鱼之乐 请循其本
亲~请看楼主贴的代码~char*在注释里乖乖的躺着 ryxcaixia 发表于 2015-6-17 09:14
子非鱼焉知鱼之乐 请循其本
亲~请看楼主贴的代码~char*在注释里乖乖的躺着
好吧 ~~~没仔细看
我看了下就一个感觉 数组不像数组 链表不像链表~~~ 牡丹花下死做鬼 发表于 2015-6-17 08:33
至于你说的问题改成 char *c; 后
输入用 scanf("%s",&p1.c ); 就应该没问题了
是啊!我知道!我就只是单纯的想知道!为什么那样会错而已!为什么? 牡丹花下死做鬼 发表于 2015-6-17 09:15
好吧 ~~~没仔细看
我看了下就一个感觉 数组不像数组 链表不像链表~~~
{:9_237:}本来就是纯属瞎搞!!!!! 牡丹花下死做鬼 发表于 2015-6-17 09:09
帮你改了下~~
{:9_232:}棒棒哒!!!! ryxcaixia 发表于 2015-6-17 09:11
哦 对了 楼主 还少看了一个问题
你问为啥char换成char* 输入就崩溃了对吧
这样如果都不崩溃, 那就出 ...
{:9_240:}原来如此 牡丹花下死做鬼 发表于 2015-6-17 09:10
fflush(stdin); 不建议使用
只是清空的话
还是
为什么不建议使用fflush(stdin)呢? 牡丹花下死做鬼 发表于 2015-6-17 09:11
顺带一提
他
gets(p1.c);
牡丹{:9_221:}当初为什么会认为这样写会出错呢?
这个程序是过了,但我又写了一个和这个相似的程序! 没过!
原因还是,能编译过!调试时,整个程序能正常运行完!
执行时,程序就崩溃了!找了下原因,把程序中关于这段的注释掉!就正常运行!
想过解决方案!用scanf也不行!{:9_220:}已经崩溃了! 牡丹花下死做鬼 发表于 2015-6-17 09:11
顺带一提
他
gets(p1.c);
神奇的问题!编译过,调试过,执行时就崩溃!我内心已然崩溃!!
http://bbs.fishc.com/thread-63557-1-1.html
(出处: 鱼C论坛)
{:9_230:}手残的我,居然点了已解决!内心再次崩溃!剁手剁手。。。。。!这个还能改成未解决吗?
页:
[1]
2