th フィールドを抽出する 1 つの方法N
(呼び出し後に文字列を元の状態に保ちながら) は、次のgetFld
関数を使用することです。まず、必要なヘッダー:
#include <stdio.h>
#include <string.h>
#include <malloc.h>
これで、関数自体が十分に文書化されていることを願っています。
char *getFld (char *srchStr, char delim, int numFld) {
char *copyStr, *retStr, *tmpStrPtr, delims[2];
// Make a copy so as to not damage original.
if ((copyStr = strdup (srchStr)) == NULL) return NULL;
// Create delimiter string from character.
delims[0] = delim; delims[1] = '\0';
retStr = NULL;
// Start loop, extracting fields.
tmpStrPtr = strtok (copyStr, delims);
while (tmpStrPtr != NULL) {
// If this is the field we want, make a copy.
if (numFld == 0) retStr = strdup (tmpStrPtr);
// Get next field.
tmpStrPtr = strtok (NULL, delims);
numFld--;
}
// Clean up, return field copy (must be freed eventually) or NULL.
free (copyStr);
return retStr;
}
最後に、そのためのテスト プログラム:
int main (void) {
int i = 0;
char str[] = "Hi:my:name:is:lacrosse1991";
char *fld;
while ((fld = getFld (str, ':', i)) != NULL) {
printf ("Field %d is '%s'\n", i, fld);
free (fld);
i++;
}
return 0;
}
これをコンパイルして実行すると、次のようになります。
Field 0 is 'Hi'
Field 1 is 'my'
Field 2 is 'name'
Field 3 is 'is'
Field 4 is 'lacrosse1991'
これは標準 Cではないことに注意してstrdup
ください。実装にない場合は、これを使用できます。strdup
現在のケースは範囲外のフィールドと区別できないため、失敗時の動作を変更することもできます。
ただし、このコードは、最初のベースラインとしては問題ありません。