• 締切済み

C言語で文字列からパラメタをsscanfで取得する上手な方法はありませんか

leaz024の回答

  • leaz024
  • ベストアンサー率75% (398/526)
回答No.2

bufの中身は恐らく変わるんですよね? だとすればsscanfでの値取得は不可能だと思います。 標準関数のstrtokではヌル文字列が取れないので、ヌル文字列も取得できる拡張strtok関数を作ればいいのではないでしょうか。 (ただし分離記号は1つとし、切り出したトークンを囲むダブルクォートは除去します。) #include <stdio.h> #include <string.h> char *ex_strtok(char *ptr, int delim) { static char *sptr = NULL; char *tok, *p; if (ptr != NULL) { sptr = ptr; }     /* 初回は文字列をセット */ else if (sptr == NULL) { return NULL; }  /* 取れない場合NULLを返す */ tok = sptr; if (p = strchr(sptr, delim)) {      /* delimを探す */ sptr = p + 1;                /* sptrを次の先頭へ */ } else { p = sptr + strlen(sptr);          /* pを文字列終端へ */ sptr = NULL;                /* 次回はNULLを返す */ } if (*tok == '\"') {            /* 先頭が"なら */ tok++;                    /* 頭の"はスキップ */ *(p-1) = '\0';                /* 尾の"は\0に変換 */ } *p = '\0';                 /* 分離記号を\0に変換 */ return tok;               /* トークンを返す */ } int main(void) { char buf[100]="\"日 本 語 12 3\",\" \",,\"aa\",,2,\"\",\"aaa\""; char *para; para = ex_strtok(buf, ','); /* 最初はbufをセット */ do { printf("<%s>\n", para); } while (para = ex_strtok(NULL, ',')); /* 次回以降はNULLでコール */ return 0; } 実行結果 <日 本 語 12 3> < > <> <aa> <> <2> <> <aaa> これならbufの中に、いくつパラメータがあってもOKでしょ? ただしex_strtokは、strtok同様に、第1引数の文字列を変更してしまいますので、元の値が必要な場合は、作業領域にコピーしてから実行してください。

関連するQ&A

  • 文字列分割

    カンマを含む項目があります。カンマまでの文字列を抽出したいです。なお、カンマの個数は未定です。 例えば A aaa,bbb,ccc ↓ P Q R aaa bbb ccc ※A,P,Q,Rは項目名 となるような、テーブルを作成したいです。(select結果でもよいです。) どうか、ご教授お願いします。

  • C言語 構造体

    以前にも構造体について質問させていただきましたが、より自由度の高い処理が必要となりご質問させていただきます。 よろしくお願いいたします。 以前のものは入力する項目数(列),行数(行)が前提にあるものでした。 テキストファイルを読み込んで、 構造体としてデータを読み込みたいのですが、 今回は項目数が不定のものです。 a.txt ------------------------- あああ,いいい,ううう ------------------------- とあれば あああ いいい ううう とカンマ抜きで得たい。(3項目) 次回読み込んだとき、 a.txt ------------------------- abc,def,g,h,i,jk ------------------------- とあれば、 abc def g h i jk とカンマ抜きで得たい。(6項目) 以前のものは下記のような感じです。 FILE *fp; FILE *file; struct seiseki seito[20]; char buf[1024]; fp = fopen("aaa.txt", "r"); i=0; while( fgets(buf, sizeof(buf), fp) ){ struct seiseki tmp; sscanf(buf,"%d %s %s %d %d %d",&tmp.no,tmp.lname,tmp.fname,&tmp.val[0],&tmp.val[1],&tmp.val[2]); seito[i++] = tmp; } for(i = 0; i < 3; i++) { printf("%d / %s %s / %d / %d / %d / %d\n", seito[i].no,seito[i].lname,seito[i].fname, seito[i].val[0], seito[i].val[1], seito[i].val[2], seito[i].val[0] + seito[i].val[1] + seito[i].val[2]); }

  • GETで値を渡すと、記号と数字がある文字列は文字化けに

    環境はxp、apache2、php5、Postgresql8.2です。 1台のPCをサーバ&クライアントにしています。 ただ今PHPとPostgresqlの勉強をしています。 いつも質問に答えてくれてありがとうございます。 GETで値を渡すと、 受け取り側(リンク先)で 記号と数字がある文字列は文字化けになってしまいます。 対処方法をご存じでしたら、ご教示して頂けたら幸いです。 --------------- ○リンク元 $aaa2 = mb_convert_encoding("みかん-1部"$row[1],"UTF-8","eucJP-win"); //英数字を全角に変換 $aaa2 = mb_convert_kana($aaa2, "KV"); $nextb = "process.php?setype=5&number=" . $aaa . "&bu=$aaa2&offset=0&page1=10"; ○リンク先 print("<span class='typea'>$_GET[bu]</span>");

    • ベストアンサー
    • PHP
  • ファイルの結合

    UNIX上で下記のようなfileA、fileBから fileA aaa,aaa,222 aaa,bbb,111 aaa,ccc,333 fileB aaa,aaa,111 aaa,bbb,222 aaa,ccc,333 aaa,ddd,999 下記のようなfileCを作ろうとしています。 fileC aaa,aaa,222 aaa,bbb,111 aaa,ccc,333 aaa,ddd,999 そこで、以下のように一列目と2列目をキーにして、sortすることにしました。 cat fileA fileB | sort -u -k1,2 -t, > fileC すると、fileCは下記のようになりました。(一行目の3列目が222ではなく、111になってしまいました) fileC aaa,aaa,111 aaa,bbb,222 aaa,ccc,333 aaa,ddd,999 キー項目以外はfileAを優先させたいのですが、なにか良い方法はないでしょうか?

  • 条件式にtrimを入れたい

    Mysqlでselectする時に、条件で指定した値とDB内のデータをtrim(空白除去)した値が一致したレコードを抽出されるようにしたいのですが・・・ 例えば、 あるテーブルの項目aaaの値が'あ いうえお'だとします。 条件式を where aaa='あいうえお' とした場合でもヒットさせたいのですが、どうすれば良いのでしょうか? aaaの値の空白を除去したものと一致すればいい、という事で select aaa from テーブル where trim(aaa)='あいうえお' ↑このようなイメージなのですが・・・ どなたか簡単なやり方を知っていれば教えて頂けませんでしょうか。 宜しくお願い致します。

    • ベストアンサー
    • MySQL
  • 【Excel】複数条件を指定したデータの取得方法

    以下のように情報が入ったExcelシート2つあります。 Sheet:Aの抽出条件を基にSheet:Bを検索に行き、完全一致するレコードが存在した場合はValue値を、不一致の場合はNullを返したいです。 当該処理をExcel関数で実施したいのですが、良い方法は無いでしょうか。 詳しい方、ご教示ください。 ※検索条件はAnd条件になります ■Sheet:A 取得条件を記載したシート。 ●条件1 ・項目1 12345 ・項目2 あああ ・項目3 AAA ●条件2 ・項目1 567 ・項目2 ううううう ・項目3 CCC ●条件3 ・項目1 111 ・項目2 えええ ・項目3 EEO ■Sheet:B マスタ(TBL)情報。 項目1 |項目2 |項目3 |項目4 |Value ―――――――――――――――――――――――――――――――――――― 12345 |あああ |AAA |あいう |100 1234 |ああ |AA |123 |10000 567 |ううううう |CCC |187 |900 789 |えええ |EEO |RYI |5000

  • データ変換について

    UNIXのコマンドの組み合わせでデータの変換をしたいのですが、キーとなる値が"@"の前後の文字列(前後最大8文字づつ)が対象となります。データの変更内容は以下のとおりです。宜しくお願いします。 <変更前データ> 1 IN: Solaris aaa@sld01 tmp/0002 2 IN: Solaris2 bbbbb@vb012 home/0123 3 OUT: Solaris aaa@sld01 tmp/0002 4 IN: Solaris3 xbgll@gho002 tmp/041 <変更後データ> 1 IN: Solaris xxxxxxxx@xxxxxxxx tmp/0002 2 IN: Solaris2 xxxxxxxx@xxxxxxxx home/0123 3 OUT: Solaris xxxxxxxx@xxxxxxxx tmp/0002 4 IN: Solaris3 xxxxxxxx@xxxxxxxx tmp/041

  • C言語でのCSVソートとデータ抽出について

    皆様、はじめまして。 この度、急ぎでプログラムをC言語で作成するように命じられました。 C言語は経験が無いと断ったのですが、要員確保が出来ない為、何とかしてくれとのこと。 本来なら自分で学習しながら、作成すべきなのですが、超短納期の為、その時間が取れません。 今回は誠に申し訳ないのですが、皆様のお力をお借り出来ないでしょうか。 宜しくお願いいたします。 仕様概要 ・CSVファイルを読み込み、2カラム目の項目(文字型)で昇順ソート(qsort)を行う。 ・ソートされた2カラム目の同一値毎に1カラム目(数値型)が最大値となるレコードを抽出する。 ・抽出されたレコードを新規CSVファイルに出力する。 入力CSV概要 ・レコード件数は日によって変わる ・カラム数は8つ ・各カラムの項目長は可変長 ・上記に伴いレコード長も可変長 入力ファイル例 39,"AAA3","B1","C1","D1","E1","F1","G1" 100,"AAA1","B2","C2","D2","E2","F2","G2" 101,"AAA2","B3","C3","D3","E3","F3","G3" 105,"AAA1","B4","C4","D4","E4","F4","G4" 102,"AA1","B5","C5","D5","E5","F5","G5" 99,"AAA2","B6","C6","D6","E6","F6","G6" 1019,"AAA3","B7","C7","D7","E7","F7","G7" 処理後に出力されるファイル 102,"AA1","B5","C5","D5","E5","F5","G5" 105,"AAA1","B4","C4","D4","E4","F4","G4" 101,"AAA2","B3","C3","D3","E3","F3","G3" 1019,"AAA3","B7","C7","D7","E7","F7","G7"

  • EXELで困っています。どなたか助けてください!

    お世話になります。早速ですが・・・ 下記のような表があります。 ┌──────┬─-─┬─-─┬─-─┬─-─┬─-─┬─-─┬─-─┐ │分類項目・・・・│AAA │BBB │CCC │DDD │EEE │FFF │GGG │     ├──────┼─-─┴─-─┴─-─┴─-─┴─-─┴─-─┴─-─┤ │「、」区切り・・・│AAA、BBB、CCC、DDD、EEE、FFF、GGG        │ ├──────┼──────────────────────-─┤ │「 」区切り・・・│AAA BBB CCC DDD EEE FFF GGG        │     ├──────┼──────────────────────-─┤ │「,」区切り・・・・│AAA,BBB,CCC,DDD,EEE,FFF,GGG             │ └──────┴──────────────────────-─┘ ■不特定の分類項目(何が記入されるかわかりません)のAAなどの  項目を上図、および、下記のように自動的に変換というか、並べ  られるようにしたいと思っています。 (1)「、」区切り(全角句点区切り) (2)「 」区切り(全角スペース区切り) (3)「,」半角句点区切り ■【質問1】VBAマクロを使わず関数などの処理にてできない       ものでしょうか?   また、  【質問2】(1)上図で「、」で区切ったもの        (2)同様に「 」で区切ったもの        (3)同様に「,」 で区切ったもの        例えとして⇒○「AAA、BBB       」             ⇒×「AAA、BBB、、、、、、、」        このようにしたいのですが?   【質問3】いずれの場合も、その新しくできた文字列を他の        ソフトウェアにコピペしようとすると、関数の数式が        コピペされてしまします。        もちろんセルをワンクリックで選択すると、値だけが        コピペできます。        この点を初心者でも失敗(数式のコピペではなく)する        ことなく、値だけをコピペすることが可能でしょうか? どうかよろしくお願いいたします。 <( _ _ )> 

  • 文字の表示に関して

    多少わかり難い質問となってしまうかもしれませんが、よろしくお願いします。 1~10までの数字をキーボードから入力し、その値によって文字'a'と'_'を次のように出力するという部分において、どのようにしたらいいのか考え付かず困っています。 (例1)キーボード入力が2の場合 _a aa a_ (例2)キーボード入力が5の場合 ____a ___aa __aaa _aaaa aaaaa aaaa_ aaa__ aa___ a____ 上記のように表示する方法が思いつきません。よろしくお願いします。

    • ベストアンサー
    • Java