2016-12-07 20 views
-1

は、次のようなユーザー からのコマンド。 ..「C」の区切り文字とスペースで文字列を分割が、特定の単語(最後、最初の名前)の間にスペースをエスケープ

私は、文字列をマルチに分割するためにデリミタ(スペース)を使用しました。文字列であるが、人の名前を1つの文字列/パラメータとして残す必要があります(人の姓と名の間には1つ以上の空白を入れることができますが、どちらの場合でも1つのパラメータとして解釈する必要があります)。私のコードで

// input from cmd stored in "input" variable with fgets() in main function...

char inputTerminalCommands(char *input) // takes char input from main, splits strings and then should compare type of command from user 
{ 

int i = 0; 
char *str = input;  
char *split = strtok(str, " "); // split string into words after "space" 

char *array[6]; 

while(split!= 0) 
{ 
    array[i++] = split; 
    split = strtok(NULL, " "); 
} 

return 0; 

私は、スペースで文字列を分割するが、どのように名前の間にスペースを無視しますか? または、1つの文字列に "relation"の後に "add"と "relation"の間に文字列を格納することもできます。

+0

人の性別も含まれています。例: 'John Smith [m] brother Jackson Smith [m]' [m]と[f]は男性と女性の性別の男性です。 – Totenkoph93

+1

あなたのキーワードであることを決定する必要があります。それらをグローバルとして格納し、 'strtok'のすべての出力を調べて、現在のトークンが何であるかを判断することができます。次に、それに応じて何かをしてください – MrMuMu

+2

あなたの入力構文に欠陥があります。あなた自身でこれに答えてください:プログラムは、名前部分や他のトークンの間にスペースがあるかどうかを知ることになっていますか? – Olaf

答えて

0

strchrを使用すると、コマンド名gender relation sexを解析できます。単語間に複数のスペースがある場合は失敗しますが、複数のスペースに対応するために追加のロジックを追加できます。フォーマットcommand name relation nameが観測されない場合にも失敗しますが、再度ロジックを追加してそれを処理できます。
mallocの障害を処理するためにチェックを追加する必要があります。

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

struct parse { 
    char *command; 
    char *name; 
    char gender; 
    char *relation; 
    char *identity; 
    char sex; 
}; 


int main(void) 
{ 
    //char input[] = "add John Smith III [m] brother David William Smith [m]"; 
    char input[] = "add John Smith III brother David William Smith"; 
    char *start = NULL; 
    char *stop = NULL; 
    int span = 0; 
    struct parse item; 
    //parse command - one word 
    start = input; 
    if ((stop = strchr (start, ' '))) { 
     span = stop - start; 
     item.command = malloc (span + 1); 
     memmove (item.command, start, span); 
     item.command[span] = '\0'; 
    } 
    //parse name - could be many words, each begins with upper case 
    start = stop + 1; 
    stop = start;; 
    while ((stop = strchr (stop, ' '))) { 
     if (!isupper(*(stop + 1))) { 
      span = stop - start; 
      item.name = malloc (span + 1); 
      memmove (item.name, start, span); 
      item.name[span] = '\0'; 
      break; 
     } 
     stop = stop + 1; 
    } 
    //optional - parse gender - one character in [] 
    start = stop; 
    item.gender = '*'; 
    if (*(start + 1) == '[') { 
     item.gender = *(start + 2); 
     stop = strchr (start + 1, ' '); 
    } 
    //parse relation - one word 
    start = stop + 1; 
    if ((stop = strchr (start, ' '))) { 
     span = stop - start; 
     item.relation = malloc (span + 1); 
     memmove (item.relation, start, span); 
     item.relation[span] = '\0'; 
    } 
    //parse name - could be many words, each begins with upper case 
    start = stop + 1; 
    stop = start;; 
    while ((stop = strchr (stop, ' '))) { 
     if (!isupper(*(stop + 1))) { 
      span = stop - start; 
      item.identity = malloc (span + 1); 
      memmove (item.identity, start, span); 
      item.identity[span] = '\0'; 
      break; 
     } 
     stop = stop + 1; 
    } 
    if (!stop) { // if nothing follows identity...strchr failed on last name 
     span = strlen (start); 
     item.identity = malloc (span + 1); 
     memmove (item.identity, start, span); 
     item.identity[span] = '\0'; 
     stop = start + span; 
    } 
    //optional - parse sex - one character in [] 
    start = stop; 
    item.sex = '*'; 
    if (*(start + 1) == '[') { 
     item.sex = *(start + 2); 
    } 

    printf ("%s\n", item.command); 
    printf ("%s\n", item.name); 
    printf ("%c\n", item.gender); 
    printf ("%s\n", item.relation); 
    printf ("%s\n", item.identity); 
    printf ("%c\n", item.sex); 

    free (item.command); 
    free (item.name); 
    free (item.relation); 
    free (item.identity); 

    return 0; 
} 
関連する問題