I would be glad if I get help with this. I am not able to accept white space in a string. I am working on socket programming using C. I tried following things. Please help me.
char name[100]; fgets (name, 100, stdin);
I tried using fflush(stdin);
before fgets.
fgets (name, 100, stdin);
scanf("%[^\n]s",name);
(Ref for 1,2&3: Reading string from input with space character?)scanf("%[^\t]s",name);
worked for me but I have to press tab+enter after giving input. Because of which everything I input after the name is printing on next line at the server. I want to create table-like structure. How can I accept string input with white spaces? Thank you in advance
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);
}