2014-09-29 42 views
1

我刚刚开始学习C编程和练习,我发现这个任务。首先,我必须以协议名义进行扫描。然后我必须检查协议的官方名称,编号和别名。所以,如果我输入TCP输出应该是这样的:
官方名称:TCP
原号码:6
别名TCPc getprotobyname获取协议信息

这就是我这么远。当我运行它并输入ip或tcp时,它不会给我任何错误。但它说协议没有找到。

在此先感谢您的帮助。

#include <netdb.h> 
#include <stdio.h> 


int main(){ 
    char name[200]; 
    int i; 

    struct protoent *proto = getprotobyname(name); 

    printf("Enter protocol name: ");   
    scanf("%c", name); 

    proto = getprotobyname(name); 


    if (proto != NULL) 
    { 
     printf("official name: %s\n", proto->p_name); 

     printf("proto number: %d\n", proto->p_proto); 

     for (i = 0; proto->p_aliases[i] != 0; i++){ 
       printf("alias: %s\n", proto->p_aliases[i]); 
      } 
    } 
    else{ 
     perror("protocol not found"); 
    } 


     return 0; 
} 
+0

错误1:'getprotobyname(名);'被称为两个时间一个before'name'初始化,第二个是后it.and错误2:'scanf(“%c”,name);'必须是'scanf(“%s”,name);' – 2014-09-29 10:48:18

回答

1
char name[200]; 
int i; 
struct protoent *proto = getprotobyname(name); 

这里name被利用之后,你通过

scanf("%c", name); 

name这也是错误的读取字符数组。需要%s格式说明符才能读取char数组。所以它应该是

scanf("%s", name); 

你的代码应该是

int main(){ 
    char name[200]; 
    int i; 

    struct protoent *proto; 

    printf("Enter protocol name: ");   
    scanf("%s", name); 

    proto = getprotobyname(name); 


    if (proto != NULL) 
    { 
     printf("official name: %s\n", proto->p_name); 

     printf("proto number: %d\n", proto->p_proto); 

     for (i = 0; proto->p_aliases[i] != 0; i++){ 
       printf("alias: %s\n", proto->p_aliases[i]); 
      } 
    } 
    else{ 
     perror("protocol not found"); 
    } 


     return 0; 
} 
+0

非常感谢。有用。 – niko85 2014-09-29 12:09:56

1

这里是错误:scanf("%c", name);

你只是通过传递格式说明scanf%c读一个单一的字符。有了这个getprotobyname()返回一个无效,因此你看到打印protocol not found

相反,您需要使用%s从标准输入读取整个字符串。

+0

非常感谢您的回答。它帮了我很多。 – niko85 2014-09-29 12:10:27

+0

@ niko85不客气 – 2014-09-29 13:37:46