从用户

时间:2015-09-04 14:35:30

标签: c input

我说我是C的初学者。 我用C编写服务器,我的代码如下:

 int main(int argc, char **argv)
 { 
     ds_socket = socket(AF_INET,SOCK_STREAM,0);
     if(ds_socket == -1)
         errore_exit("creation socket");

     struct sockaddr_in server;
     struct sockaddr client; 

     //set sockadrr_in

     server.sin_family = AF_INET;
     server.sin_port = htons(9999); 
     server.sin_addr.s_addr = INADDR_ANY; 

     //binding    
     if(bind(ds_socket, &server,sizeof(server)) == -1)
         errore_exit("binding");

   if(listen(ds_socket,1000) == -1)
       errore_exit("listen");

   client_socket = accept(ds_socket,&client,&(sizeof(client))); 

   if(client_socket == -1)
       errore_exit("accept");    
}

在设置结构服务器时,我花了很多任何端口(9999),但我想以这种方式实现它:服务器在使用bind为套接字分配地址之前向用户询问端口号。用户输入端口键盘的数量,服务器保存在变量"端口"然后将其传递到结构的设置中。

我不能做到刚刚描述的最后一部分:有人可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

使用scanf读取用户输入

int var;
scanf("%d", &var);

现在var包含用户输入的整数。

您会注意到格式说明符与printfhttp://www.cplusplus.com/reference/cstdio/printf/)非常相似。

scanf返回成功读取的值。因此,为了确保用户输入一个数字,请检查scanf是否返回1.

scanf的一个问题是它在stdin中留下了一个尾随换行符。所以,你需要冲洗它:

void flush()
{
    int c;
    while ((c = getchar()) != '\n')
        ;
}

这将消耗所有字符,直到看到换行符。不要使用fflush(stdin)来刷新。

了解K& R中的scanf(第128页,第7.4节):http://www.iups.org/media/meeting_minutes/C.pdf

完整的scanf示例:

int main()
{
    int age;
    printf("What is your age?");

    if (scanf("%d", &age) > 0)
        printf("You are %d yrs old", age);
    else
        fprintf(stderr, "Numbers only!");
    flush();                      /* use the flush function shown above*/

    return 0;
}