使用scanf时无限循环

时间:2017-03-11 19:31:54

标签: c client-server

我正在编写一个由客户端和服务器通信组成的C程序。在客户端文件中,我使用scanf("%79[0-9a-zA-z ]", message);(接受数字,字母和空格)来扫描用户发送到服务器的输入,但是我得到一个无限循环。下面是使用它的代码部分:

 while(1)
    {
        printf("Enter message : ");
        scanf("%79[0-9a-zA-z ]", message); 

    if( send(sock , message , strlen(message) , 0) < 0)
    {
        puts("Send failed");
        return 1;
    }

    //Receive a reply from the server
    if( recv(sock , server_reply , 2000 , 0) < 0)
    {
        puts("recv failed");
        break;
    }

    puts("Server reply :");
    //printf("\nServer reply : %s " ,server_reply);
    puts(server_reply);
}
exit(0); 
close(sock);

输出包含&#34;输入消息&#34;和&#34;服务器回复&#34;连续。

2 个答案:

答案 0 :(得分:2)

代码需要使用新行@BLUEPIXY

while(1) {
    printf("Enter message : ");
    scanf("%79[0-9a-zA-z ]", message); 

    // Now the \n needs to be read
    int ch = fgetc(stdin);
    ...
}

更好的代码会添加支票

while(1) {
    printf("Enter message : ");
    fflush(stdout); // insure potentially buffered data is outputted

    if (scanf("%79[0-9a-zA-z ]", message) != 1) {
      puts("Nothing read");
      break;
    }

    int ch = fgetc(stdin);
    if (ch == `'\n') {
      ; // good: new line
    } else if (ch == EOF) {
      break; // no more input or input error
    } else {
      puts("Unexpected input");
      break;
    }
    ...
}

更好的代码会使用fgets()

char buf[81];
while (1) {
    printf("Enter message : ");
    fflush(stdout);

    if (fgets(buf, sizeof buf, stdin) == NULL) break;
    char ch;
    if (sscanf(buf, "%79[0-9a-zA-z ] %c", message, &ch) != 1) {
      puts("Nothing or too much read");
      break;
    } 
    ...
}

答案 1 :(得分:-1)

使用

scanf("%79[0-9a-zA-z ]", &message);

而不是

scanf("%79[0-9a-zA-z ]", message);