无法在C中接受字符串中的空格

时间:2017-10-02 02:05:42

标签: c input whitespace

如果我得到这方面的帮助,我会很高兴的。我无法接受字符串中的空格。我正在使用C编写套接字编程。我尝试了以下内容。请帮帮我。

  1. char name[100]; fgets (name, 100, stdin);
  2. 我尝试在fgets之前使用fflush(stdin);

    1. fgets (name, 100, stdin);

    2. scanf("%[^\n]s",name); (参考1,2& 3:Reading string from input with space character?

    3. scanf("%[^\t]s",name);为我工作,但我必须在输入后按tab + enter。因为我在名称后输入的所有内容都在服务器的下一行打印。我想创建表格式的结构。如何接受带空格的字符串输入?提前谢谢

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

1 个答案:

答案 0 :(得分:0)

要从字符串中修剪空格,请遍历字符串,直到isspace返回false。您还可以通过使用strlen跳转到字符串末尾并使用isspace向后工作来修剪尾随空格。在此处显示的示例中,我们修剪任何前导或尾随空格,并打印结果。

#include <ctype.h>
#include <string.h>
#include <stdio.h>

int main(){
    printf("Please enter your name: ");
    fflush(stdout);

    char buf[128];
    fgets(buf, 128, stdin);


    int start = 0;
    // remove any leading whitespace.
    while(isspace(buf[start])) start++;

    int end = strlen(buf);
    // find the first character from the end that is not whitespace
    while(end > start && isspace(buf[end - 1])) end--;

    buf[end] = '\0'; // terminate the string to trim the whitespace at the end.

    char * name = &buf[start];
    printf("Name = '%s'\n", name);
}