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;
}
人の性別も含まれています。例: 'John Smith [m] brother Jackson Smith [m]' [m]と[f]は男性と女性の性別の男性です。 – Totenkoph93
あなたのキーワードであることを決定する必要があります。それらをグローバルとして格納し、 'strtok'のすべての出力を調べて、現在のトークンが何であるかを判断することができます。次に、それに応じて何かをしてください – MrMuMu
あなたの入力構文に欠陥があります。あなた自身でこれに答えてください:プログラムは、名前部分や他のトークンの間にスペースがあるかどうかを知ることになっていますか? – Olaf