【发布时间】:2017-10-02 02:05:42
【问题描述】:
如果我能得到这方面的帮助,我会很高兴。我无法接受字符串中的空格。我正在使用 C 进行套接字编程。我尝试了以下操作。请帮帮我。
char name[100]; fgets (name, 100, stdin);
我尝试在 fgets 之前使用fflush(stdin);。
fgets (name, 100, stdin);scanf("%[^\n]s",name);(参考 1,2&3:Reading string from input with space character?)scanf("%[^\t]s",name);为我工作,但我必须在输入后按 Tab+Enter。因此,我在名称后输入的所有内容都将打印在服务器的下一行。我想创建类似表的结构。如何接受带有空格的字符串输入?提前谢谢你
client.c
#include <stdio.h>
#include <ctype.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdlib.h>
#include <string.h>
#define SERVER_PORT 5432
#define MAX_LINE 256
struct course{
char name[100];
char id[20];
int registered;
int empty;
char time[20];
};
int main(int argc, char * argv[])
{
struct course c;
FILE *fp;
struct hostent *hp;
struct sockaddr_in sin;
char *host;
char buf[MAX_LINE];
int s, new_s,n;
int len;
int rec=1;
char data[1000];
int choice;
char search[20], del[50];
char add[1000]="\n";
char avail[10],ocu[10],sem[10],id[10];
if (argc==2) {
host = argv[1];
}
else {
fprintf(stderr, "usage: simplex-talk host\n");
exit(1);
}
hp = gethostbyname(host);
if (!hp) {
fprintf(stderr, "simplex-talk: unknown host: %s\n", host);
exit(1);
}
bzero((char *)&sin, sizeof(sin));
sin.sin_family = AF_INET;
bcopy(hp->h_addr, (char *)&sin.sin_addr, hp->h_length);
sin.sin_port = htons(SERVER_PORT);
if ((s = socket(PF_INET, SOCK_STREAM, 0)) < 0) {
perror("simplex-talk: socket");
exit(1);
}
if (connect(s, (struct sockaddr *)&sin, sizeof(sin)) < 0) {
perror("simplex-talk: connect");
close(s);
exit(1);
}
do{
printf("\n\n*************************************************\n");
printf(" 1.List All \n 2.Search \n 3.Add \n 4.Delete \n 9.Quit \n");
printf("\nPlease enter your choice: \n");
scanf("%d",&choice);
switch(choice)
{
case 1: send(s, &choice,sizeof(int), 0);
printf("\n==============Requesting All Records..=======================\n");
len = recv(s, &data,sizeof(data), 0);
fputs(data,stdout);
break;
case 2: send(s, &choice,sizeof(int), 0);
printf("\nPlease Enter Course Name/ID: ");
scanf("%s",&search);
send(s, &search,sizeof(search), 0);
printf("\n======================Searching for The Record..================\n");
len = recv(s, &data,sizeof(data), 0);
fputs(data,stdout);
break;
case 3: send(s, &choice,sizeof(int), 0);
printf("Press Tab And Enter After Entering Course Name...\n");
printf("Please Enter Course ID: ");
scanf("%s",&c.id);
printf("Please Enter Course Name: ");
scanf("%[^\t]s",&c.name);
printf("No of Students Registered: ");
scanf("%d",&c.registered);
printf("No of Vacancies: ");
scanf("%d",&c.empty);
printf("Course Time: ");
scanf("%s",&c.time);
send(s, &c,sizeof(struct course), 0);
printf("\nInserting New Record..\n");
break;
case 4: send(s, &choice,sizeof(int), 0);
printf("Press Tab And Enter After Entering Course Name...\n");
printf("Please Enter Course Name/ID To Drop: ");
//scanf("%[^\t]s",&data);
scanf("%100[^\n]", del);
//fgets(del,sizeof(del),stdin);
send(s, del,sizeof(del), 0);
break;
default: printf("Please enter valid choice...\n");
}
}while(choice!=0);
}
【问题讨论】:
-
fgets()有什么问题?所有其他选择都是危险的。而且,fflush(stdin)是严格的未定义行为。 -
不让我输入名字。
-
这与sockets完全无关。
-
scanf("%[^\n]s",name);中不应有s。使用scanf("%100[^\n]", name);或scanf("%99[^\n]%*c", name); -
“不让我输入名字。”是先前未发布的代码的结果。发布足够多的代码,这些代码本身就说明了问题。
标签: c input whitespace