• ベストアンサー

文字列を任意の場所で分割(split)したい

mkiiの回答

  • ベストアンサー
  • mkii
  • ベストアンサー率40% (43/105)
回答No.1

strtokがありますが、結局自分で少しは書かなくてはいけないと思います。 ちょっとCで書いてみました。関数化すればよいと思います。 struct QUERY { char *name; char *value; }; void XXX() { char *kari = "www=xxx&yyy=zzz"; char qbuf[128]; strcpy(qbuf, kari); struct QUERY *query; char *p; int count = 1; for (p = qbuf; *p != '\0'; p ++) { if (*p == '&') count ++; } query = (struct QUERY *)malloc(sizeof(struct QUERY) * count); count = 0; query[0].name = qbuf; for (p = qbuf; *p != '\0'; p ++) { if (*p == '=') { *p = '\0'; query[count].value = p + 1; } else if (*p == '&') { *p = '\0'; count ++; query[count].name = p + 1; } } free(query); }

pythian
質問者

お礼

ポインタを受け付けない硬い頭によく効きました。 無事に動作して、関数化、組み込みができました。ありがとうございます。

関連するQ&A

  • CSVファイルの""内コンマの処理

    以下のようなCSVファイルがあります。 xxx,yyy,"z,zz",XXX,"YY,Y",ZZZ,111,222 これを、 xxx,yyy,zzz,XXX,YYY,ZZZ,111,222 の様にperlで ""内のコンマを取りたいのですが、どうしたらよいでしょうか? xxx,yyy,z zz,XXX,YY Y,ZZZ,111,222 の様に""内コンマを別の文字に置き換えても可です。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • 要素名を表示させたい

    <data>   <aaa xxx="0">     <yyy zzz="1"/>     <yyy zzz="2"/>   </aaa>   <bbb xxx="0">     <yyy zzz="1"/>     <yyy zzz="2"/>   </bbb>   <ccc xxx="0">     <yyy zzz="1"/>     <yyy zzz="2"/>   </ccc> </data> 上のようなXMLから、XSLのvalue-ofなどを使って、 要素名aaa、bbb、cccを表示させるにはどう記述すればいいのでしょうか?

    • ベストアンサー
    • XML
  • 表示されているレコードを1つ上にする

    環境:ACCESS2003&XP Pro テーブルとそのテーブルをソースにしたクエリーを元に一覧形式のフォームを作成しています。以下のようなイメージです。 品名  仕様  数量 単価 合計  A   xxx xxx xxx xxx ↑  b   yyy yyy yyy yyy ↑  C   zzz zzz zzz zzz ↑ *↑はボタン 上記の表示で↑ボタンをクリックすると 表示されたレコードがひとつ上に行く方法が わかりません。 よろしくお願いします。 例:上記で品名bの↑ボタンをクリック 品名  仕様  数量 単価 合計  b   yyy yyy yyy yyy ↑  A   xxx xxx xxx xxx ↑  C   zzz zzz zzz zzz ↑

  • 文字列を二文字以上の文字列で分割したい。

    文字列を二文字以上の文字列で分割したい。 perlやrubyなどではsplitを使えば任意の文字列で文字列を分割して配列に突っ込むことができたと思います。 c++でこういったことをやりたくて書いたりサイトを参考にしたりしていたのですが、 http://goodjob.boy.jp/chirashinoura/id/100.html http://networkprogramming.blog18.fc2.com/blog-entry-89.html のようにstrtokを使うと、たとえば..ドット二個が含まれるところで分割したいのにもかかわらずdelimに..を指定するとドットが一つのところでも分割されてしまいます。 文字列"cut"が含まれるところで切断したい場合でもc,u,tそれぞれが含まれる場所で切断されてしまします。 このような問題を解決するにはどのようにするのがいいのでしょうか? MFCで書いてるのでそれに含まれるライブラリなどが使える場合それを用いることができます。

  • 文字列を分割して変数に格納したい

    文字列を分割して変数に格納したいのですがうまくいきません。 ---以下ソース--- #include <stdio.h> #include <string.h> void main(void){ char tai[]="name1=value1&name2=value2&name3=value3&name4=value4"; char *tp; int a; int b; int i; int co=0; a=strlen(tai); for(i=0;i<a;i++){ if(tai[i] == '='){ co++; } } b=co; char *nameset[b]; char *valueset[b]; *nameset[0]=*strtok( tai,"&=" ); i=1; co=0; while ( tp != NULL ) { if(0==i%2){ co=i/2; *nameset[co] = *strtok( NULL,"&=" ); } else{ co=i/2; *valueset[co] = *strtok( NULL,"&=" );} i++; } for(i=0;i<b;i++){ printf("%s : %s\n",nameset[i],valueset[i] ) } } ---ソースここまで--- どうしたらちゃんと変数に格納されますか?

  • UNIXコマンドのjoinについて

    -------------- -------------- 1 XX XXX 1 xx xxx 2 YY YYY 2 yy yyy 3 ZZ ZZZ  3 zz zzz ~      ~ -------------- -------------- UNIXコマンドのjoinを用いて上の二つのファイルを結合させ、 ---------------------- 1 XX XXX xx xxx 2 YY YYY yy yyy 3 ZZ ZZZ zz zzz ~ ---------------------- としたかったのですが、一列目の数字が急に変化するとそれ以降の行が出力されなくなります。(例えば、100の次が1000になった時など) どのようしたらこのような事が防げるのでしょうか? もしjoinでは防げないなら、joinのように2つのファイルの1列目の数字が同じだった時に結合して出力してくれるプログラムを書ける方がいたら教えていただきたいです。 perlかC++だと助かります。よろしくお願いします。

  • " と ' のために外部ファイルの読み込みに失敗

    <a href="xxx.html" onMouseOut="AA()" onMouseOver="BB('Image1','','yyy.jpg',1)"><img src="zzz.jpg" name="Image1"></a> このようなソースを作って、外部ファイルとしました。 読み込むためにdocument.write('')を使って document.write('<a href="xxx.html" onMouseOut="AA()" onMouseOver="BB('Image1','','yyy.jpg',1)"><img src="zzz.jpg" name="Image1"></a>'); このようにしたのですが、表示されません。 BBの中の引数の’が原因だということは分かるのですが、解決方法がわかりません。 分かる方、いらっしゃいましたらお教えください。 よろしくお願いします。

  • Perlのファイル操作の置換について

    Perlを利用し、ファイル内の置換操作を行いたいと思います。Perlに関して全く無知なので誰か教えてください。 変換したい内容を下に記載します。 (1)html:button value="aaa" name="bbb" c:button property="${aaa.bbb}"                      ↓↓  (2)html:button value="aaa" name="bbb" c:button property="${aaa.bbb}" 上記の変換ではvalueとnameがpropertyになる (3)html:button value="xxx" var="yyy"        ↓↓ (4)c:button prop="xxx" id="yyy" (3)に関してはvalueとvarの間に何か他の処理が入ってもvalueとvarだけを特定し、変換できるScript文にしたいです。 言葉足らずだったらすみません。誰か教えて下さい。

    • ベストアンサー
    • Perl
  • ファイルアップローダ+複数のディレクトリを削除するシステムについて

    以下のようなフォルダ構成で、複数のディレクトリを削除するシステムを構築しよと しましたが、1ディレクトリのみしか削除できませんでした。 20090601 - xxx1.txt yyy1.txt zzz1.txt のフォルダ20090601と、ファイルxxx1.txt,yyy1.txt,zzz1.txt のみしか削除できませんでした。理想は、すべてのディレクトリ、ファイルを削除しようと、試行錯誤 しましたが、なかなかうまくいきません。 わかる人がいたら、ご教授のほどよろしくお願いします。 ============フォルダ構成==================================== 20090601 - xxx1.txt yyy1.txt zzz1.txt 20090602 - xxx2.txt yyy2.txt zzz2.txt 20090603 - xxx3.txt yyy3.txt zzz3.txt 20090604 - xxx4.txt yyy4.txt zzz4.txt $_WK_dir_name[1] = "20090601" $_WK_dir_name[2] = "20090602" $_WK_dir_name[3] = "20090603" $_WK_dir_name[4] = "20090604" ============プログラム====================================== // ファイルアップロード処理 (省略) // ディレクトリ数のカウント処理 (省略) // ディレクトリとディレクトリの中身を削除 for ($i = 1; $i < 4; $i++) { // 削除するディレクトリパスを設定 $_dir_path = './' . $_WK_dir_name[$i] . '/'; printf("★1"); // ディレクトリ・ハンドルをオープン $res_file = opendir( $_dir_path ); printf("★2"); // ディレクトリ内のファイル名を1つずつを取得 while( $file_name = readdir( $res_file ) ){ // ファイルかどうか判定する if (is_file($_dir_path . $file_name)) { unlink($_dir_path . $file_name); } } printf("★3"); closedir( $res_file ); printf("★4"); rewinddir( $res_file ); printf("★5"); // ディレクトリの中身が空になったところで、ディレクトリを削除する。 rmdir($_WK_dir_name[$i]); printf("★6"); } ============================================================

    • ベストアンサー
    • PHP
  • Perl5.6.1での「5C」コードの文字化け対策について

    Perl5.6.1でCGIを動作させています。 下記コードで「テーブルyyy」から「列xxx」を引っ張ってきて xxxのデータ(文字列)を変数test2に格納しようとしているのですが、 xxxのデータ(文字列)内に2バイト目が「5C」コードの文字(表・予・申など)が含まれる場合、「Can't call method "Fields" on an undefined value at C:\~~~.cgi line 行数」というエラーが発生してしまいます。 このエラー出力で表示される行数はtest2に文字列を格納する行で発生しているのですが、既存のPerl5.6.1のままでエスケープ・置換処理をどのように行えばよいのでしょうか。 以上、よろしくお願い致します。 use Win32::OLE; $db = Win32::OLE->new("ADODB.Connection"); $db->Open($conn); $test = $db->Execute("SELECT xxx FROM yyy WHERE zzz=aaa"); $test2=$test->Fields('xxx')->Value;