C言語で、
char buf[100]="\"日 本 語 12 3\"," ",,\"aa\",,2,\"\",\"aaa\"";
から
para1=日 本 語 12 3
para2=<空白>
para3=なし
para4="aa"
para5=(なし)
para6=2
para7=(なし)
para8=aaa
を取得するようなうまい方法はありませんか。
条件
1)項目はカンマでくぎってあるとする
2)項目に値がない場合として、""あるいは何もない場合がある。
3)""の中の値には日本語や英数字が入っている。
OSはSolaris(UNIX)です。
よろしくお願いいたします。
A 回答 (2件)
- 最新から表示
- 回答順に表示
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引数の文字列を変更してしまいますので、元の値が必要な場合は、作業領域にコピーしてから実行してください。
No.1
- 回答日時:
ギブアップ。
専用の関数を作らないと駄目でしょう。ダブルクォーテーションを
削除していませんが、こんな感じか。
#include <stdio.h>
#include <stdarg.h>
void split_by(
char *str,
char sep,
...
)
{
va_list ap;
char* to;
char* p;
va_start(ap, sep);
to = va_arg(ap, char*);
p = str;
while (*p)
{
if (*p == sep)
{
*to = '\0';
to = va_arg(ap, char*);
}
else
{
*to++ = *p;
}
++p;
}
*to = '\0';
va_end(ap);
}
int main(void)
{
char buf[100]="\"日 本 語 12 3\",\" \",,\"aa\",,2,\"\",\"aaa\"";
char para1[30], para2[30], para3[30], para4[30], para5[30], para6[30], para7[30], para8[30], para9[30];
split_by(buf, ',', para1, para2, para3, para4, para5, para6, para7, para8, para9);
printf("para1=<%s>\n", para1);
printf("para2=<%s>\n", para2);
printf("para3=<%s>\n", para3);
printf("para4=<%s>\n", para4);
printf("para5=<%s>\n", para5);
printf("para6=<%s>\n", para6);
printf("para7=<%s>\n", para7);
printf("para8=<%s>\n", para8);
printf("para9=<%s>\n", para9);
return 0;
}
実行結果。
para1=<"日 本 語 12 3">
para2=<" ">
para3=<>
para4=<"aa">
para5=<>
para6=<2>
para7=<"">
para8=<"aaa">
para9=<>
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
- Java javaのCSVデータ読込についてです 6 2022/07/02 10:58
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- その他(プログラミング・Web制作) プログラミング pythonの問題について 2 2022/04/19 00:41
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- 大学受験 国立受験 11月からの大逆転劇を起こすには 7 2022/11/14 19:24
- Visual Basic(VBA) VBA エクセル 条件の設定 1 2022/03/28 10:24
- Visual Basic(VBA) VBAを使いシート間で貼り付け 3 2023/03/14 20:53
- その他(Microsoft Office) Excel 2列の値を返す数式についてです 1 2022/11/23 22:59
- Excel(エクセル) capeofdragonと申します Excel2016を使っておりまして 半角又は全角の任意文字列が 2 2022/10/31 13:51
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
干支のプログラム
-
TCP/IP通信型大文字・小文字変...
-
c++ 文字列を入力して、一文字...
-
C言語のfor文です。 繰り返しの...
-
CStringをwchar_tに変換したい
-
Visual Studio strcpyについて
-
charからLPTSTRへの変換方法
-
charでの計算?
-
配列をnビットシフトする
-
int main()の・・・
-
double型の値をchar配列に変換...
-
switch文で文字を比較すること...
-
DPマッチング
-
int型からchar型への変換
-
文字列から空白を取り除きたい...
-
バイナリファイルをコピーする...
-
c言語でユーザ関数を利用して入...
-
C言語のポインターで詰まっている
-
C++ の FileCopy の設定が解り...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
charでの計算?
-
C言語のfor文です。 繰り返しの...
-
charからLPTSTRへの変換方法
-
文字列から空白を取り除きたい...
-
C言語の入力した文字を反転させ...
-
'const char *' 型は 'char *' ...
-
配列をnビットシフトする
-
str系関数を使わずに二つの文字...
-
int main()の・・・
-
atoi( ) の反対をやりたい
-
CStringをwchar_tに変換したい
-
c++ 文字列を入力して、一文字...
-
switch文で文字を比較すること...
-
干支のプログラム
-
3桁区切(コンマ)記号をつけ...
-
絶対パスからのファイル名の切...
-
間接操作のレベルとは
-
間接参照のレベルが異なっています
-
型変換
おすすめ情報