我正在编写一个由客户端和服务器通信组成的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;连续。
答案 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);