-1

学生の姓と名を含むテキストファイルを読み取る必要があります。ねじれたプログラムの要件に従って、姓と名は char POINTERS です。各行は fgets を使用して読み取られます。したがって、配列構造体に変数 char *last_name、char *first_name があります。

例えば:

ビル・クリントン

ウィリアム・ゲイツ

strtok ポインターで strlen を使用して、実行時にサイズを割り当てる必要があります...

問題は、strtok と strlen を使用して名前の長さを調べると、元の data_line が既に分割されていることです! 誰もこれを行う方法を知っていますか?

4

1 に答える 1

1

必要な主要な関数はすべて既に名前が付けられているので、順調に進んでいます。

名前が 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()が両方を達成し、望ましいでしょう。

于 2012-12-02T02:15:29.780 に答える