必要な主要な関数はすべて既に名前が付けられているので、順調に進んでいます。
名前が char ポインターであることは理にかなっています。C には文字列型はなく、文字の配列だけです。また、これは紛らわしいですが、C では配列とポインターが関連しています。それらは同じではありませんが、多くの場合で同じように動作します。char ポインター引数を必要とする関数は、char ポインターまたは配列名 (インデックスなし) のいずれかを受け入れることができると考えてください。また、インデックスを持つ配列は、実際にはオフセットを示すインデックスを持つ特定のアドレスへのポインターを逆参照しているだけであることに注意してください。
したがって、動的なサイズの文字列が必要な場合は、それを char ポインターとして宣言し、動的にメモリを割り当てる必要があります (つまり、malloc)。あなたの場合、姓と名のサイズはそれぞれ異なります-そして、それぞれに1つのポインターがあります-したがって、それらのそれぞれに1つのmallocが必要です。複数の区切り文字で strtok() を使用する場合と同様に、strlen() を使用することも適切です。
strtok() の例を見たいと思うかもしれません - それは一度に各トークンを 1 つずつ返すことができます (そしてそうするでしょう)。 このリンクには、質問と説明的な回答の間の良い例があります。
編集:より具体的には、コードで求めているものの核心は次のとおりです。
トークンの取得:
token = strtok(data_line, sep); // First token on data_line
または:
token = strtok(NULL, sep); // Subsequent tokens on data_line
次に、メモリを割り当てて名を格納する例 (姓は完全に類似しています):
person[i].first_name = malloc(strlen(token) + 1);
strcpy(person[i].first_name, token);
strlen() の結果に追加される 1 の値は、null ターミネータ用のスペースを作ることです。
編集 2: malloc() と strcpy() を使用するよりも、strdup()が両方を達成し、望ましいでしょう。