使用 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;
}
...
}
我正在编写一个由客户端和服务器通信组成的 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;
}
...
}