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)です。
よろしくお願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (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引数の文字列を変更してしまいますので、元の値が必要な場合は、作業領域にコピーしてから実行してください。
    • good
    • 0

ギブアップ。



専用の関数を作らないと駄目でしょう。ダブルクォーテーションを
削除していませんが、こんな感じか。


#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=<>
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q読点とカンマの違い

「読点」の意味を辞書で引いたら下のようにでていたのですが、今ひとつよく意味が解りません。英語のカンマとはどう違うのか説明してほしいんですが。


味の切れ目を示すため、文中に施す「、」の符号。→句点

お願いします。

Aベストアンサー

「味の切れ目」→「意味の切れ目」ですね。(^^)

で,既に出ている回答とも重なりますが,日本語でも横書きの場合はカンマを使うことがあります。特に数字やアルファベットのあとに読点が来ると何となく間が抜けてみえるので,数字や欧文を多用する理工系の図書や雑誌などに多く見られます。
この文章もそのスタイルで書いています。なので,farsideさんの前の質問(http://oshiete1.goo.ne.jp/kotaeru.php3?q=98303)の回答で「今も使っていません。」と断言されてしまうと,私が書いているのは一体何なの?と,ちょっと困ってしまいます。
あ,よく見ると「正式な日本語の文章にカンマはありません。」でしたね。正式じゃないからいいのか。でも,それなら正式な日本語って何? 理工系の図書や雑誌は大多数が正式じゃないってこと? 「公用文の書き方」(という政府の内部規定)が正式? じゃ民間の文章はみんな正式じゃないのか? よくわからなくなってきました。

話を戻しますと,横書きの日本語でカンマを使うか読点を使うかは,単にその図書なり雑誌なりの出版社が編集方針として決めているだけのことで,機能的には従来からの読点と何ら変わりがありません(数値の区切りとかは別)。
では,その日本語本来の読点と,英文のカンマはどう違うかというと…基本的には,文(センテンス)の中に打って,意味上の切れ目を示すわけですから,似たようなものといってよいでしょう。
ただ,細かく見ていくと,そもそも英文法と日本語文法が違いますので,比較のしようがなくなってくると思います。たとえば,英語では関係節と主節を区切る時に使いますが,日本語ではそもそも関係代名詞がありませんね。

英語のカンマの打ち方は,文章のルールブックというのがいろいろとあって,それを見ると出ています。代表的なものとして,Chicago Manualの中から該当のページを参考URLに載せておきました。カンマの打ち方だけで,全部で27項目あります。

ちなみに,中国語では読点(、)は並列を表し(日本の中黒「・」のような使い方),それ以外はすべてカンマです。横書きでも縦書きでも一緒です。
日本語で書くとこんなふうになるでしょうか。「私は,彼女と一緒に,京都、奈良、大阪、神戸を旅して回った。」

参考URL:http://www.publicbookshelf.com/public_html/Manual_of_Style/commarule_i.html

「味の切れ目」→「意味の切れ目」ですね。(^^)

で,既に出ている回答とも重なりますが,日本語でも横書きの場合はカンマを使うことがあります。特に数字やアルファベットのあとに読点が来ると何となく間が抜けてみえるので,数字や欧文を多用する理工系の図書や雑誌などに多く見られます。
この文章もそのスタイルで書いています。なので,farsideさんの前の質問(http://oshiete1.goo.ne.jp/kotaeru.php3?q=98303)の回答で「今も使っていません。」と断言されてしまうと,私が書いているのは一体何なの?と...続きを読む

Qint i,j; \n i=0,j=5;

int i,j;
i=0;
j=5:
と書いてあるソースは普通ですが、
int i,j;
i=0,j=5:
と書いてあるソースもあります。
後者はC++の正しい書式ですか?

カンマ演算子というのは後者のカンマのことですか?

Aベストアンサー

 正しい書式です。

i=0,j=5;
 における、「,」をカンマ演算子といいます。2項の演算子です。カンマで区切られた演算を「左から順番に」実行し、最後の演算を結果として返します。
 したがって、例の文であれば、i=0を実行し、次にj=5を実行。そして、j=5の結果の5を結果として返します。
 ・・・
 が、本来的には、あまり、例のような使い方はしませんね。よく見られるのは、次のような場合です。

 for (i=0,j=0 ; i < 50 ; ++i,++j) {

 のような形でよく見られます。for文の各式は、一つの式でなければならないので、こんな書き方をするわけです。初期化と更新部が一つにまとまり、ループが読みやすくなるのが利点かな。

Q電卓 パソコン カンマの位置の違い

999円以上の数字を打つときにパソコンと電卓とで不思議に思うことがあります。

例えば「1000」と表記する時に
千の位と百の位の間の下に「,(コンマ)」を入れて
「1,000」とするようですが
なぜ電卓では上にコンマを入れるのでしょうか?
(私が保有している電卓だけなのか?)

電卓では
区切り点と小数点を見やすくするためですか?
しかしもしそうなら
なぜ電卓だけで、普段のパソコンなどでの書式は
区切り点と小数点も下に点をつけるのでしょうか?

 何かわかる方よろしくお願いします。

Aベストアンサー

> なぜ電卓では上にコンマを入れるのでしょうか?

・日本(アメリカ、イギリス)では、3桁ごとの区切りは「,」カンマ、小数点は「.」ピリオドが使われています。
ところが、ヨーロッパ圏を主体に、日本とは逆の3桁ごとの区切りは「.」ピリオド、小数点は「,」カンマが広く使われています。

近年、インターネットオークションなどで、桁取りや少数点でトラブルが多発するようになりました。
そこで、2003年10月17日にフランスのパリで行われた国際度量衡(どりょうこう)総会(CGPM)で、小数点を統一するための会議が行われました。

この国際会議で決定されたのが、なんと、なんと、、、
・「小数点は、ピリオドまたはコンマのどちらでもOK」と決められました。
・その代わり「3桁ごとの位取りはスペースを用いる、または、無し」となりました。

例: 123 456 789.012(ピリオド) または 123 456 789,012(コンマ) と定められました。


第22回国際度量衡総会決議(PDF)
http://www.intermet.jp/metric/22ndCGPM.pdf
原文
http://www1.bipm.org/jsp/en/ViewCGPMResolution.jsp?CGPM=22&RES=10

=ご質問に係わる要約=(上記PDFの7ページ)
2003年、第22回国際度量衡総会において、小数点は「小数点は、ピリオドかコンマのどちらかとする」と決められました。
3桁区切りは、3桁ごとに空白を入れて読みやすくするのは構わない。
しかし、混乱を避けるため3桁区切りに「コンマやピリオド」を使ってはならないと規定されています。

そこで、2003年以降の電卓では、従来の位置に3桁区切り「コンマ」を使うことが出来なくなったため、電卓メーカーは、苦肉の策としてzxdaeg様のご質問の通り、上部に印(マーク)を付けています。

添付写真の通り、古い電卓では、従来の位置に3桁区切り記号があります。

> なぜ電卓では上にコンマを入れるのでしょうか?

・日本(アメリカ、イギリス)では、3桁ごとの区切りは「,」カンマ、小数点は「.」ピリオドが使われています。
ところが、ヨーロッパ圏を主体に、日本とは逆の3桁ごとの区切りは「.」ピリオド、小数点は「,」カンマが広く使われています。

近年、インターネットオークションなどで、桁取りや少数点でトラブルが多発するようになりました。
そこで、2003年10月17日にフランスのパリで行われた国際度量衡(どりょうこう)総会(CGPM)で...続きを読む

Qc:\Winodows\Sendotoとc:\Windows\デスクトップについて

設定によってはシステムをc:\Winodowsからc:\winにできるから
c:\Winodows\Sendotoとc:\Windows\デスクトップを
c:\win\Sendotoとc:\win\デスクトップにできます

同じように"Sendoto"と"デスクトップ"を例えば"Send"と"desktop"のように他の名前にできるのでしょうか?
できたとするとどのように命名されているかはどこを見れば良いのでしょうか?

Sendotoのファイル等はデスクトップ上の右クリックメニューの送るに表示され
デスクトップのファイル等は起動後に真っ先に現れる画面に表示されますね

よろしくお願いします

Aベストアンサー

SHGetSpecialFolderLocationを使ってください。

参考URL:http://www.okweb.ne.jp/kotaeru.php3?q=235894

Q英文中のカンマの使い方について

英文の中で、so の前のカンマが有るのと無いのがありますが、なぜですか?違いは何ですか?

全般的に、カンマの打ち方、法則みたいのがあれば教えてください。

宜しくお願いします。

一応自分でも調べてみたのですが、難しい説明でしたので、・・・簡単に解説していただければ幸いです。

Aベストアンサー

「だから」のような意味の時はコンマを使うことがあります。しかし、法則という程のものはありません。so が very のような「とても」という意味になる時はコンマは使いません。very good, so good 、どちらもコンマは使いません。

Q2 ~ 200 の素数 a, b, c (a < b < c) が、b - a = c - b を満たすa,b,cをビット操作を用いて求め、すべてを表示せよ

ちょっと考えてみました。でも、分かりません・・・まず、int型のintvalに200bitを割り当てて、intval=0としたいのですが、どうしたらいいのでしょう??
とりあえず考えてみたプログラムを誰か見て下さい!!お願いします。
#define BYTESIZE 200
#define MAX 200
main()
{
int i,j,intval=0;
for(i=2;i<=MAX/2;i++)
{
if(intval&(1<<(i-1)){}
else for(j=i*2;j<=MAX;j+=i)intval|=(1<<(j-1));
}/*素数を0、それ以外を1に
for(i=2;i<=MAX/2;i++)
for(j=2;j<=(MAX-i)/2;j++)
if((intval&(1<<(i-1))&&(intval&(i+j-1))&&(intval&(1<<(i+2*j-1)))) print("%3d %3d %3d (%3d)\n",i,i+j,i+2*j,j);
}/*三つ子の素数を調べ出力

ちょっと考えてみました。でも、分かりません・・・まず、int型のintvalに200bitを割り当てて、intval=0としたいのですが、どうしたらいいのでしょう??
とりあえず考えてみたプログラムを誰か見て下さい!!お願いします。
#define BYTESIZE 200
#define MAX 200
main()
{
int i,j,intval=0;
for(i=2;i<=MAX/2;i++)
{
if(intval&(1<<(i-1)){}
else for(j=i*2;j<=MAX;j+=i)intval|=(1<<(j-1));
}/*素数を0、それ以外を1に
for(i=2;i<=MAX/2;i++)
for(j=2;j<=(MAX-i)/2;j++)
if((intval&...続きを読む

Aベストアンサー

まずint型は200ビットもありません。通常は32ビットです。
200ビット使いたければint型を7個用意する必要があります。
つまり
int intval[7];
宣言して、
intval[0] 0~31ビット
intval[1] 32~63ビット
intval[2] 64~95ビット
.
.
.
intval[6] 182~200ビット
として使います。

第iビットの情報を取り出すときは
(intval[i>>5]>>(i&31))&1

第iビットを1にするときは
intval[i>>5]|=1<<(i&31);

とすれば良いでしょう。
関数やマクロを用意することをお勧めします。
例えば
int get(int intval[],int i)
{
return (intval[i>>5]>>(i&31))&1;/*0か1が返って来る。*/
}

void on(int intval[],int i)
{
intval[i>>5]|=1<<(i&31);
}

という感じです。

まずint型は200ビットもありません。通常は32ビットです。
200ビット使いたければint型を7個用意する必要があります。
つまり
int intval[7];
宣言して、
intval[0] 0~31ビット
intval[1] 32~63ビット
intval[2] 64~95ビット
.
.
.
intval[6] 182~200ビット
として使います。

第iビットの情報を取り出すときは
(intval[i>>5]>>(i&31))&1

...続きを読む

Q",which"と"which"の違いとは

関係代名詞の”,Which”とカンマのないWhichの違いとは何なんでしょうか。よく理解できていないので、教えてください。お願いします。

Aベストアンサー

(1)which:限定(制限)用法
(2), which:非制限用法
と呼びます。

前者は、一般に先行詞を「限定」するために、後者は先行詞に「追加情報」を与えるために用います。

よく使う例ですが
(1)Tom has three pens which look very expensive.
(2)Tom has three pens, which look very expensive.

(1)の方では、'pens'のうち、「高そうに見える」ものだけに話の対象を限定しています。

対して(2)の方では、トムの持っている'pens'に対して、それが「高そうに見える」という情報を付け加えています。

その結果生じる明確な違いは、
(1)の場合には、「3本の高そうなペン」以外に、「高そうではないペン」を持っている可能性があります。言い換えれば、(1)の文は「高そうなペン」の話しかしていない(限定している)ため、それ以外についてはわからないのです。

(2)の場合には、「トムは3本のペンを持っている」と言った上で「そのペンは高そうに見える」という情報を追加しているので、トムの持っているペンはその3本以外にはないという含みがあります。

(1)which:限定(制限)用法
(2), which:非制限用法
と呼びます。

前者は、一般に先行詞を「限定」するために、後者は先行詞に「追加情報」を与えるために用います。

よく使う例ですが
(1)Tom has three pens which look very expensive.
(2)Tom has three pens, which look very expensive.

(1)の方では、'pens'のうち、「高そうに見える」ものだけに話の対象を限定しています。

対して(2)の方では、トムの持っている'pens'に対して、それが「高そうに見える」という情報を付け加えています。
...続きを読む

QBuffer overrun, data ..

メールソフトで、openssl を使って、
ヤフーメールにPOP接続して、800個ほど溜まっているメールを取り出そうとしています。

メッセージID を確認しながら重複しないように取り出そうとしています。
700個ほど取り出したのですが、
その後、頻繁に

Buffer overrun, data truncated

のメッセージが出て、ストップします。

このメッセージはopenssl が作成しているのでしょうか?
また、原因、対策はなんでしょうか?

Aベストアンサー

http://oshiete.goo.ne.jp/qa/8198656.html
↑を見る限り自分でメッセージを出しているのでは?
その通りであれば、原因や対策も見えてくるはずです。

Qこの問題、どうしてカンマ不要なのか?

次のような英作問題がありました。
二番目の問題で、「but の前には、カンマをつけよ」と模範解答にはありました。
一番目の問題では、「andの前」には、カンマがありません。
これはどうしてなのでしょうか。

■彼女は立ち上がって窓を開けました。(andを用いて)
She stood up and opened the window.

■私はとても疲れていましたが、母を手伝いました。
I was very tired, but helped my mother.

二つとも、前節と後節の主語は同じです。
二つとも、二つの文章を結びつけています。
一見、「違いはないじゃないか」と思いました。

私が考えた2つの文章の違いは、

◇一番目の文章は、立ち上がり→窓をあけるという一連の動作であること。
◇また、一番目の文章の方が、二番目の文章と比べると…まあ、短い。

よって、一番目のandの前には、カンマがつかないのかと思いましたが…。

しかし、自信がもてません。

アドバイスを、お願いいたします。

Aベストアンサー

この問題、どうしてカンマ不要なのか?
次のような英作問題がありました。
二番目の問題で、「but の前には、カンマをつけよ」と模範解答にはありました。
一番目の問題では、「andの前」には、カンマがありません。
これはどうしてなのでしょうか。

andやbutは、等位接続詞と言って、基本は2つの同等なものをつなぎます。
Tom and Mary are married.
名前と名前をつなぎ、同等なものを結んでいます。


■彼女は立ち上がって窓を開けました。(andを用いて)
She stood up and opened the window.
→この場合、upはついていますが、stoodとopenedという動詞を2つ結んでいます。
ここにカンマを入れることは可能ですが、
その場合、彼女が立ち上がり、それからーーと、ひと呼吸あるといいますか、少しそこに時間のずれを感じさせます。
She stoop up, and opened the window.はちょっと特殊な言い方となりますね。

■私はとても疲れていましたが、母を手伝いました。
I was very tired, but helped my mother.
→これはbe動詞と一般動詞という、同じ動詞でも、種類の違うものを結んでいます。
こういう場合、
1.I was [ very tired ] and [ ( I was ) helped ]
2.I [ was very tired ] and [ I ] helped.
という2つの解釈の可能性が生じてしまいます。
ところが、カンマを入れることにより、1ではなく、2だということになるのです。
この場合カンマを入れるべきです。

以上、ご参考になればと思います。

この問題、どうしてカンマ不要なのか?
次のような英作問題がありました。
二番目の問題で、「but の前には、カンマをつけよ」と模範解答にはありました。
一番目の問題では、「andの前」には、カンマがありません。
これはどうしてなのでしょうか。

andやbutは、等位接続詞と言って、基本は2つの同等なものをつなぎます。
Tom and Mary are married.
名前と名前をつなぎ、同等なものを結んでいます。


■彼女は立ち上がって窓を開けました。(andを用いて)
She stood up and opened the window.
→この場合、up...続きを読む

Qfscanf(),scanf()とBuffer Overflow

scanf("%s", buf);
で、bufの長さはどれくらいに取ればよいのでしょう。

sscanf(buf,"%s",buf2);
なら、sizeof(buf)以上に大きくならないでしょうが、scanf(), fscanf()で文字列を読み込むときは、Buffer Overflowの危険から逃れられないような気がしています。

私はそのため、文字列を扱うときには、この二つの関数を使わないでいるのですが、安全な使用方法はあるのでしょうか?

scanf("%10s",buf);
のような使い方は知っています。でもこれでは文字数が10文字だったのか、それ以上だったのか判別できません。知りたいのは最大文字数が未知の場合です。

こう使えば安全という使い方があればぜひご紹介ください。

Aベストアンサー

こんなのはどうでしょうか?

if (scanf("%10s%c", buf, &c) < 2 || isspace(c))
 puts("10文字以下だった");
else
 puts("10文字を超えてちょん切られた。");

あまりパッとしませんね。


人気Q&Aランキング

おすすめ情報