• ベストアンサー

strtok関数 自作

strtok関数の内部の処理がしりたいので、自作された事がある方はぜひソースプログラムを教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • BLK314
  • ベストアンサー率55% (84/152)
回答No.2

1: /* 2: * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. 3: * See the copyright notice in the ACK home directory, in the file "Copyright". 4: */ 5: /* $Header: strspn.c,v 1.1 89/05/11 10:09:09 eck Exp $ */ 6: 7: #include <string.h> 8: 9: size_t 10: strspn(const char *string, const char *in) 11: { 12: register const char *s1, *s2; 13: 14: for (s1 = string; *s1; s1++) { 15: for (s2 = in; *s2 && *s2 != *s1; s2++) 16: /* EMPTY */ ; 17: if (*s2 == '\0') 18: break; 19: } 20: return s1 - string; 21: }

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • BLK314
  • ベストアンサー率55% (84/152)
回答No.3

1: /* 2: * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. 3: * See the copyright notice in the ACK home directory, in the file "Copyright". 4: */ 5: /* $Header: strpbrk.c,v 1.2 89/12/18 16:02:21 eck Exp $ */ 6: 7: #include <string.h> 8: 9: char * 10: strpbrk(register const char *string, register const char *brk) 11: { 12: register const char *s1; 13: 14: while (*string) { 15: for (s1 = brk; *s1 && *s1 != *string; s1++) 16: /* EMPTY */ ; 17: if (*s1) 18: return (char *)string; 19: string++; 20: } 21: return (char *)NULL; 22: }

全文を見る
すると、全ての回答が全文表示されます。
  • BLK314
  • ベストアンサー率55% (84/152)
回答No.1

/* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: strtok.c,v 1.2 90/08/28 13:54:38 eck Exp $ */ #include <string.h> char * strtok(register char *string, const char *separators) { register char *s1, *s2; static char *savestring; if (string == NULL) { string = savestring; if (string == NULL) return (char *)NULL; } s1 = string + strspn(string, separators); if (*s1 == '\0') { savestring = NULL; return (char *)NULL; } s2 = strpbrk(s1, separators); if (s2 != NULL) *s2++ = '\0'; savestring = s2; return s1; }

it200189
質問者

お礼

ありがとうございました!!

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • strtok関数の使い方

    http://oshiete1.goo.ne.jp/kotaeru.php3?q=2361151 で、質問させて頂いた者です。 先日は大変にお世話になりました。 先日の質問の続きという感じなんですが… ------------------ 「ex」ファイルのデータ 41 4352 42 2341 43 5411 --------- これらのデータを kihokyu[1].tosi=41 kihokyu[1].kan=4352 kihokyu[2].tosi=42 kihokyu[2].kan=2341 という感じで格納したいのです。 ------------------------ 回答者の方にご指導して頂いたように、 ・ ・ ・ while(fgets(buff,sizeof buff,fp) != NULL){ if ( i > 50 ){ break; } kihokyu[i].tosi = atoi(strtok(buff , " ")); kihokyu[i].kan = atoi(strtok(NULL , " \n")); printf("%d\n",kihokyu[i].tosi); i++; } というstrtok関数を使ってみました。 ところが 41 42 43 と、表示されたあと 強制終了になってしまいます。 >kihokyu[i].kan = atoi(strtok(NULL , " \n")); を削除すると スムーズに処理が終了します。 >printf("%s\n",NULL); と、「NULL」の値を調べたところ 「{NULL}」と表示されました。 たぶん、strtok関数の使い方がおかしいと思うのですが ご教授して頂けたら幸いです。

  • malloc関数(strtok関数の自作版)につきまして分からないこと

    malloc関数(strtok関数の自作版)につきまして分からないことがあります。 以下のプログラムにmallo関数がフリーする最適な位置を明示しなさいといわれました。 文字が分離した時にfreeすると助言されたのですが いまいち理解できません・・・。 条件式の中で使用するともいわれていました。(おそらくif文・・・。) 色んな意見を参考にしたいので詳しい方助言のほうよろしくおねがいします。 なおプログラムはほかの箇所を変更したり、他の場所でもmalloc関数を使用することが認められています。 またfreeする場所はメイン関数ではなくあくまでもstrtok関数の中で宣言するようです。 よろしくお願いします。 #include <string.h> #include <stdio.h> #include <stdlib.h> main(){ char* s2 = ",/"; char* result; char* r1; char* r2; char* r3; char* r4; result = strtok("//123//,45/,678,9/","/,"); r1 = strtok(NULL, s2); r2 = strtok(NULL, s2); r3 = strtok(NULL, s2); r4 = strtok(NULL, s2); printf("%s\n",result); printf("%s\n",r1); printf("%s\n",r2); printf("%s\n",r3); printf("%s\n",r4); return; } char *strtok(char *s1, const char *s2) { int i,len; char *str1, *str2 , *str3; static char *tok ; static char* mstr; if(s1 != NULL) { str1 = s1; } else { str1 = tok; } str2 = str1 + strspn(str1, s2); /* strspnを利用 */ if (*str2 == '\0') { return (NULL); } len = 1; i = 0; while(*(str2 + i) != '\0'){ len++; i++; } mstr = (char*)malloc(sizeof(char)*len); if(mstr == (NULL)) { return 0; } i = 0; while(*(str2 + i) != '\0'){ *(mstr + i) = *(str2 + i ); i++; } *(mstr + i ) = '\0'; str3 = mstr + strcspn(mstr, s2); /* strcspnを利用 */ if (*str3 != '\0'){ *str3 = '\0'; str3 = str3 + 1; } tok = str3; return (mstr); }

  • strtokを使用したループ内でのstrtok

    お世話になっております。 現在C言語で下記のようなstrtokを使用したプログラムを作成しております。 (関係なさそうな箇所については省略しております。) 【ソース】 str="abc.def,ghi.jkl,mnopq.r,kkk.bbb" for( a=strtok(str,",\n") , a , a=strtok(NULL,",\n"){ b=strtok(a,"."); c=strtok(NULL,"."): } 【質問内容】 上記の内容を使用したソースでは、for文のa=strtok(NULL,",\n")にてaに値がはいりません。 (2回目のループに行かない) 上記のような処理を実施したい場合、皆様どのようなソースを作成しているかご教示いただけないでしょうか。 よろしくお願いいたします。

  • strtok()について

    c言語にてstrtok()を使用しています。 以下の型をグローバル変数で宣言し、 (ヘッダ) typedef struct { char *pTmp; int len; } stAAA; (.cソース) stAAA stA; ある関数にてmalloc()によりstA.pTmpに動的に領域を割り当て、 "ABCDEFG:ABCDEFG:ABCDEFG:"という値を格納するとします。 その後他関数にてstA.pTmp内の":"をトークンとしstrtok()で 切り出す場合、stA.pTmpを切り出し後もアドレス移動させたく ないため strtok()使用関数にて以下のようにしたのですが・・・・ グローバル変数のアドレスが操作されてしまいます。 どうすればよいでしょうか?strtok()用にmalloc()する? int test(){ char *pTmp; char *pTok; pTmp = stA.pTmp; while ((pTok = strtok(pTmp, ":")) != NULL) { : : } }

  • 次のソースの使い方(strtok()関数)

     次のソースプログラムについてです。 (“□”は、タブを表します) ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆ #include <stdio.h> #include <stdlib.h> /* EXIT_SUCCESS */ #include <string.h> /* strtok() */ int main(void) { □int i, n; □char str[10], *token1, *token2; □scanf("%d", &n); □for (i=0; i<n; i++) { □□scanf("%s", str); □□token1 = strtok(str, ","); □□token2 = strtok(NULL, ","); □□printf("hello = %s , world = %s\n" ,token1 ,token2); □} □return EXIT_SUCCESS; } ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆  これを実行すると、入力待ち画面になって、何を入力すれば何が得られるのか、てんで分からないのですが、どなたか、このプログラムの使い方と意味について、解説をお願いします。  ちなみに、“1”を入力した後、[Ctrl]+[c]で抜けると、結果は、 ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆ hello = ヒヒz@俳・, world = (null)◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆ となりました。

  • ライブラリ関数strpbrkの仕組みが知りたい

    ライブラリ関数strpbrkの仕組みが知りたいです。 どのような処理が行われているのかソースプログラムで確認したいので自作したことがある、もしく はすぐに作れるという方がいらっしゃれば教えてください。 よろしくお願いします。

  • c#でC言語のstrtokに相当する関数は何か

    文字列から指定した文字でデータを区切る関数strtokがC言語にはある これに相当するC#の関数は何か 例えばCでは以下のように書く。 char data1[]= " 123 , 456 Yamada " ; char *token ; strtok( data, " ," ) ; /* スペースとカンマを区切りに文字列を抽出 */ token = strtok( str, " ." ); printf(" token chat = %s\n", token ) ; while ( token != NULL ) { token = strtok( NULL," ." ); if ( token != NULL ) printf(" token chat = %s\n", token ) ; } これに相当するc#のSplit関数を使用すると 不要な空白を取り出しているようである 知っている方がおりましたら、教えて下さい。

  • strtokについて

    ただ今、C言語の勉強中のヨッピーともうします。 今回質問させていただきたいのは、strtokについてです。 時間を格納している文字列 char time[] = "2007:10:18:22:30:55";//年月日時間 から不要な「:」を抜き出す作業を行っています。 ただ、抜き出して表示するのではなく、別の変数に「:」を抜かした 文字列を代入させたいのです。 char kakunou[16];     //用意した変数に kakunouに"20071018223055" //「:」が入っていない日付を入れたい 自分で調べましたら、strtokやstrtokenという関数が使用したらいいのではないことが分かりました。 どうしたら、不要な文字を抜かして新しい変数に代入できるでしょうか? また、他にいい方法がありましたら、strtokを使用しなくても大丈夫です。 よろしくお願いいたします。

  • strtok関数の使い方 その2

    http://oshiete1.goo.ne.jp/kotaeru.php3?q=2376843 で、質問させて頂いた者です。 先日は大変にお世話になりました。 先日の質問の続きという感じなんですが… ------------------ 「ex」ファイルのデータ 41 100000 42 110000 43 120000 --------- これらのデータを kihokyu[1].tosi=41 kihokyu[1].kan=100000 kihokyu[2].tosi=42 kihokyu[2].kan=110000 という感じで格納したいのです。 ------------------------ お陰様で、kihokyu[].tosiの方は 格納する事が出来ました。 ただ、 kihokyu[].kanの方が 格納することが出来ません。 「1245015」という値が 格納されてしまいます。 この原因は strtokの第一引数にNULL を渡したときの動作を 理解していないのかも知れません。 ------------------------ バッファにいったん蓄えて >buff = "41 100000\n" 41を構造体「kihokyu[i].tosi」に格納 >kihokyu[i].tosi = atoi(strtok(buff , " ")); ここが上手く行かない 10000を構造体「kihokyu[i].kan」に格納したつもり >kihokyu[i].kan = atoi(strtok(NULL , " \n")); 私の理解では、説明文の方に >2回目以降の呼び出しでは s1 に NULL を指定します と、ありましたので この時点で、NULL変数には 「10000」が蓄えられていると 理解しています。 この認識は間違っているのでしょうか? ご教示して頂けたら幸いです。

  • 自作関数について

    質問なのですが自作関数を作成した際に、その関数ごとに 保存などはするのでしょうか?それとも、通常通り 関数が入っているソースごと保存するのでしょうか? 自分のイメージでは関数のソースをフォルダ等にまとめて 一括管理しているのかと思っているのですが、、、 実際どうななんでしょうか?よろしくお願いします。

Juno dsについての質問
このQ&Aのポイント
  • Juno ds76に関する質問があります。Daw controlで音源が勝手に切り替わる現象が起きる場合、切り替えさせずに再生する方法はあるのでしょうか?
  • Daw controlでJuno ds76を使用している際に、音源が勝手に切り替わってしまう問題に困っています。
  • Juno ds76を使用している際にDaw controlで音源が勝手に切り替わってしまう問題が発生しています。この問題の解決方法を教えてください。
回答を見る