• ベストアンサー

strtokについて

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

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

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

int j = 0; for ( int i = 0; time[i] != '\0'; i++ ) {   if ( time[i] != ':' ) {     kakunou[j] = time[i];     j++;   } } kakunou[j] = '0'; strtokを使うのであれば char sep[] = ":"; char* tok; kakunou[0] = '\0'; tok = strtok( time, sep ); while ( tok != NULL ) {   strcat( kakunou, tok );   tok = strtok( NULL, sep ); } ライブラリ関数を使いたいならお使いのコンパイラのヘルプを確認しましょう

yoppy_c
質問者

お礼

strtokの例題を載せていただきまして、 ありがとうございます。 strtokをよく分かっていなかった事が判明しました。 文字列をNULL留めにされるので、2回に分けて行わないと できないんですね。 参考になりました。

その他の回答 (4)

回答No.5

  #include <stdio.h> int main(void) { char *time = "2007:10:18:22:30:55"; char str[16]; puts(time); sprintf(str, "%.4s%.2s%.2s%.2s%.2s%s", time, time + 5, time + 8, time + 11, time + 14, time + 17); puts(str); return 0; }

yoppy_c
質問者

お礼

回答ありがとうございます。 そうですね。sprintfもありました。 まだまだ考えが浅い事を実感しました。

noname#48699
noname#48699
回答No.4

不要な文字を抜かして新しい変数に代入したい、「どうしたら」できるかとのこと、 まず、 ★文字列がどのようにメモリ内に格納されているか、をイメージしましょう。 >char time[] = "2007:10:18:22:30:55"; の宣言(代入)ですので(char は8ビットで1文字)、 time[0]には、00110010(0x32)が入り、 time[1]には、00110000(0x30)が入ります。 ここまでは判りますよね、そして末端 time[19]には、00000000(0x00)がコンパイラによって入れられます。 《必要な知識:アスキーコード、c言語の文字列の扱い》 つぎに、 ★頭から、不要な文字(':'=0x3A)を抜かして 0x00が現れるまで順次、新たな変数に代入するだけ。 ・新たな変数の末端に自分で0x00をつける必要があることに注意。 または、結果からのひとつの「方法」として、0x30≦数字≦0x39 だけを代入し、末端に0x00をつける。 そこで、 ★strtok ですが、これは「不要な文字列」を指定して切り出す関数のようです(使用経験なし)が、例えば、 char time[] = "2007/10/18 22:30:55"; ということもあり、使いにくそう。 というか、 【結論】関数を探すのではなく、自分で関数を《作る》気概で勉強すれば・・・。 と思います(今年でC言語はじめてちょうど20執念・・いやいや周年)。

yoppy_c
質問者

お礼

イメージがあまり掴めていませんでした。 ちゃんと、どう動いているのかを把握しながらやるのが大切なんですね。 大変参考になりました。 私も執念を重ねて行こうと思います。

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.3

★単純に『:』文字以外を別の配列にコピーすれば良い。だけ。 ・配列とか、文字列とかに理解していますか?  分かれば strtok 関数は使わずに出来ます。  下にサンプルを2つ載せておきます。 サンプル1: char time[] = "2007:10:18:22:30:55"; //年月日時間 char kakunou[ 16 ]; //用意した変数に int i; for ( i = 0 ; time[i] != '\0' ; i++ ){  kakunou[ i ] = time[ i ]; // 全部ならコピー } kakunou[ i ] = '\0'; サンプル2: char time[] = "2007:10:18:22:30:55"; //年月日時間 char kakunou[ 16 ]; //用意した変数に int i, j; for ( j = i = 0 ; time[i] != '\0' ; i++ ){  if ( isdigit(time[i]) ){   kakunou[ j++ ] = time[ i ]; // 0-9 文字ならコピー  } } kakunou[ j ] = '\0'; 解説: ・サンプル1はそのままを time → kakunou 配列にコピーしています。  サンプル2は数字文字を time → kakunou 配列にコピーしています。  ifの条件は『:』文字以外と判定しても良いです。  今回は 0-9 の文字を isdigit 関数で判別しています。 ・以上。ちなみに ctype.h をインクルードしないと isdigit は利用できません。

yoppy_c
質問者

お礼

2つも例題を下さりありがとうございました。 色々な考え方がありますね。 isdisitを使用した事がなかったので、参考になりました。

  • a-saitoh
  • ベストアンサー率30% (524/1722)
回答No.1

先頭からfor分で1文字ずつ見ていけばいいでしょう。 strtokを使ったほうが面倒です。

yoppy_c
質問者

お礼

ありがとうございました。 for分と、strtok両方作って見ることにします。

関連するQ&A

専門家に質問してみよう