linux fgets :

#include<stdio.h>
#include<netdb.h>
#include<string.h>
int main()
{
struct servent *s;int i;
for(i=0;i<4;i++)
{
char name[100];
char pro[100];
int n;
fgets(name,99,stdin);
fgets(pro,99,stdin);
s=getservbyname(name,pro);
printf("name:%s\tport:%d",s->s_name,s->s_port);
}
return 0;
}
问题用fgets出现core dumped而用gets则正常运行,但是gets不是过时了么,所以求助fgets问题出在哪了!

第1个回答  2012-09-29
首先这个问题是段错误(core dumped),你得知道为什么会出现断错误,一般情况都是因为越界问题,为什么会有越界呢,你对内核所占的内存执行了非法的写操作,你会问我哪里有啊?
struct servent *s这里 我觉得你就产生所谓的野指针,野指针就是不知道指向了内存的什么地方的指针,我想s这个指针就是指向了非法内存部分,而你s=getservbyname(name,pro);这里又有了操作,我想应该是这里产生的段错误,其实要验证你这个错误的地方出来哪里,你可以gdb,然后run这样就可以知道错误处在哪里,
还有一个问题就是你说的gets这个“过时”了,不是你说的那样,gets只不过是有危险,会产生越界,而fgets呢 则不会,他会自动在你最后给你补上\0, gets则不会,他会一直写,有的时候会写到非法内存,这个时候就会出现段错误了

希望对你有帮助,给最佳答案吧追问

但是我用gets没问题,如何解释!!而且野指针复制给只是指向malloc分配的地方,应该没问题

本回答被网友采纳
第2个回答  推荐于2016-11-25
fgets读取到换行符时是把换行符存在字符串的最后一个字符的,而gets是不存储换行符的,所以你传到getservbyname中的name中最后一个字符是换行符,不是一个合法的主机名本回答被提问者采纳
相似回答