使用 scanf 时无限循环

Infinite loop when using scanf

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

 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);

输出由"Enter message"和"server reply"连续组成。

使用

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

而不是

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

代码需要消耗新行

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;
    } 
    ...
}