sscanfの使い方について

このQ&Aのポイント
  • sscanf関数を使用して、指定の形式に従って文字列からデータを抽出する方法を探しています。
  • 質問文章のように、指定した文字列から特定の文字列パターンを抽出する際に、sscanf関数を使用することができます。
  • しかし、現在のコードでは、抽出したい文字列パターンが最初の変数にのみ格納され、他の変数には何も格納されていません。正しい方法を教えてください。
回答を見る
  • ベストアンサー

sscanfの使い方について

char *str = ./aa...a/b..bb/cc..c/d...dd.txt"; の aa...a , b..bb , cc..c , d...dd を取り出したいのですが sscanf(str,"./%s/%s/%s/%s.txt",a,b,c,d); とすると,aだけにすべての文字列が入ってしまい,他のb,c,dには何も入りません. つまり.a = "aa...a/b..bb/cc..c/d...dd.txt" となります. a,b,c,dはいずれも char a[512],b[512],c[512],d[512] となっております. 取り出すうまい方法がありましたら教えてください.

  • jpir
  • お礼率40% (15/37)

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

  • ベストアンサー
  • mac_res
  • ベストアンサー率36% (568/1571)
回答No.2

#include <stdio.h> int main(void) { char a[512],b[512],c[512],d[512]; char *str = "./aa...a/b..bb/cc..c/d...dd.txt"; sscanf(str, "./%511[^/]/%511[^/]/%511[^/]/%511[^/]", a, b, c, d); printf("a=:%s:\nb=:%s:\nc=:%s:\nd=:%s:\n", a, b, c, d); return(0); }

jpir
質問者

お礼

ありがとうございます. とても参考になりました.

その他の回答 (1)

  • bulgaris
  • ベストアンサー率50% (8/16)
回答No.1
jpir
質問者

お礼

前の質問であったのですね.気がつきませんでした. これからはもっと調べてから質問しようと思います.

関連するQ&A

  • sscanfって・・・。

    #include<stdio.h> main() { char str[] = "aiueokkakikukekossashisusesottstituteto"; char a[20], b[20], c[20], d[20]; sscanf(str,"%[^k],%[^s],%[^t],%[^\0]",a,b,c,d); printf("%s\n",a); printf("%s\n",b); printf("%s\n",c); printf("%s\n",d); } 上のプラグラムでaはaiueoとちゃんと出力されるのですがb,c,dがちゃんと出力されないのはなぜでしょうか?与えられた文字を代える以外によい方法があれば教えてください。

  • C言語のsscanf関数の上手な使い方2

    質問NO.60489の追加です。 C言語で、 char buf[256] = "\"aa, aa\",100,\"bb bb\",200,\"cc-cc\"; char c1[10],c2[10],c3[10]; int i1,i2; のとき、 c1 = "aa, aa" c2 = "bb bb" c3 = "cc-cc" i1=100 i2=200 に読み込みたいのですが、 sscanf(buf,"\"%[^\"]\",%d,\"%[^\"]\",%d,\"%[^\"]\"",c1,i1,c2,i2,c3); では失敗します。 sscanfのformat部分をどのように書いたらよいか分かりません。

  • C言語のsscanf関数の上手な使い方

    C言語で、 char buf[256]; char c1[10],c2[10],c3[10]; sscanf(buf,"%s%s%s",c1,c2,c3) という、バッファから文字列を読み取るとき、 bufが、 "aa bb","aa,bb","aa, bb"の場合に、 c1 = "aa bb" c2 = "aa,bb" c3 = "aa, bb" が入るようにする方法をご存知でしたら教えてください。 %[^\"]sを使ってみたのですが、c1しか格納できませんでした。 (条件) " "かつ,で区切られた部分をパラメタに格納する。 " "内には、空白や,が入る。

  • sscanfでフォーマットに合っているかを調べるには。

    今,Cの関数で0-9,A-Zの4文字以内の文字列かどうか を調べたいのですが, int main() { int i; char str[] = "ABCD" /* 調べたい文字列1 */ char str1[]= "ABC@" /* 調べたい文字列1 */ char str2[]= "ABCDE" /* 調べたい文字列1 */ char *p; p = str; /* ここをstr1,str2に変える */ if (strlen(p) != 4) printf("エラーです\n"); for (i = 0; i < 4; i++) { if (!isupper(p[i]) && !isdigit(p[i])) { printf("えらーです\n"); return EXIT_FAILURE; } } printf("すべてOKです\n"); return EXIT_SUCCESS; } というようにすれば,strとstr1とstr2がフォーマットに合うかわかるのですが,これをsscanfの正規表現を使用して実装したいのですが,可能でしょうか。 int main() { int ret; char str[] = "ABCD" /* 調べたい文字列1 */ char str1[]= "ABC@" /* 調べたい文字列1 */ char str2[]= "ABCDE" /* 調べたい文字列1 */ char *p; chat tmp[30]; p = str; ret = sscanf(p, "%4[0-9A-Z]", tmp); if (ret != 1) { printf("エラーです\n"); return EXIT_FAILURE; } printf("すべてOKです\n"); return EXIT_SUCCESS; } といしょうとするならば,str1のときは,@までのABCの文字列がとれて,retには1が帰ってきてしまいます。 なにか4文字以内ということを実装できる正規表現の使い方はあるのでしょうか? ちなみに sscanf(str, "%1[0-9A-Z]%1[0-9A-Z]%1[0-9A-Z]%1[0-9A-Z]", tmp1, tmp2, tmp3, tmp4) という以外でわかる方,よろしくおねがいします。

  • エクセル2003のVBAを教えて

    エクセル2003のVBAを教えてください。 次の対象データで、(1)(2)(3)の作業が出来るエクセルVBAを教えて下さい。 (1)(2)(3)個々のVBAでお願いします。 ●対象データ:種類(A列)、文字(B列)、    データの行数:不特定なので、データのある最終行までとします。 ●教えていただきたい項目  (1):種類だけを(C列)に取り出す。  (2):種類の先頭に空白の行を3行入れて、追加の2行目の種類(A列)に文字(B列)を入れる。  (3):種類が5行以上あるときは、5行ごとに空白行を追加する。 ●対象データ 種類(A列)   文字(B列) AA       あああ BB       いいい BB       いい BB       いいい CC       うう CC       うう DD       ええええ DD       ええええ DD       ええええ DD       ええええ DD       ええええ DD       ええええ DD       ええええ ●(1)のVBAの結果(このようになるVBAを教えてください。) (C列) AA BB CC DD ●(2)、(3)のVBAの結果(このようになるVBAを教えてください。) 種類(A列)    文字(B列) あああ AA        あああ いいい BB        いいい BB        いいい BB        いいい うう CC        うう CC        うう ええええ DD        ええええ DD        ええええ DD        ええええ DD        ええええ DD        ええええ DD        ええええ DD        ええええ

  • 文字列をfloatで読み込む(atoi,sscanf)。しかし、値がおかしい。

    お世話になっています。 C言語の質問です。 文字列をfloatで読み込もうとしているのですが、出力結果がおかしくて困っています。 文字列をatofで変換した場合、doubleでは上手く表示できるのですが、floatでは少数が上手く表示できません。 また、sscanfでも試したのですが、上手く表示できませんでした。 どうしても、doubleを使わずにfloatであらわしたいと考えています。 どうかこのプログラムの問題点のご指摘お願いします。 実行結果 53.196600 53.196602 53.196602 ソース #include<stdio.h> #include<stdlib.h> #include<string.h> main() { char str[100]="53.1966"; double b; float c,d; b = atof(str); printf("%f\n",b); c = (float)atof(str); printf("%f\n",c); sscanf(str,"%f",&d); printf("%f\n",d); } 開発環境 windowsXP cygwin

  • sscanf エラー

    sscanfで整数が読み込めません。 コマンドプロンプトの画面は以下のようです。 文章を入力してください。 aaaa 11 14 aaaa 4201776 4201870 1 以下が実行したコードです。 #include<stdio.h> int main(void){ int a,b,c,i; char name[20]; printf("文章を入力してください。\n"); scanf("%s",x); c=sscanf(x,"%s %d %d",name,&a,&b); printf("%s %d %d %d\n",name,a,b,c); return(0);} aaaa 11 14と表示されるように、御指摘おねがいします。

  • Excel2003で他の列のデータをドロップダウンリストに

    質問のし直しです。 下記の場合、B列でのドロップダウンリストに(aa bb cc dd ee)と表示させるには、どうしたら良いのでしょうか? A列  B列 bb     dd aa     ee bb     ee cc    dd aa bb 実際には文字列なのですが、1300行で、A列のデータは300個位在ります。 宜しくお願い致します。

  • 文字を置き換える関数で分からないことがあります。

    文字列strの中にある、文字列bagと共通の文字を空白に置き換える関数とその動作を確認するための、空白に置き換えた文字列strを表示するプログラムですが、戻り値が正しくないそうです。 ヒントでもいいのでどう直せばいいのかどなたかお教え下さい。 #include <stdio.h> char str_space(char str[], char bag[]){ int a, b, c, d; for(a = 0; a <= 99; a++){ if(str[a] == '\0'){ c = a; break; } } for(a = 0; a <= 99; b++){ if(bag[a] == '\0'){ d = a; break; } } for(a = 0; a <= c; a++){ for(b = 0; b <= d; b++){ if(str[a] == bag[b]){ str[a] = ' '; } } } return str[]; } int main(void){ char str[100], bag[100]; scanf("%s", str); scanf("%s", bag); printf("%s", str_space(str, bag)); return 0; }

  • c言語 sscanf の書式についての質問です

    C言語でCSVファイルの読み込みをしようとしています。CSVの中身は以下の2通りあります。 ・[ ] で囲った文字列(1行に1つだけ) ・データの並び(1行に2つ以上) 具体的には、[ ] で囲った文字列と、最初の2つのデータのみが抽出対象です。そこで以下のコードを書いてみましたが、最後に示すように、[ ] で囲った文字列がうまく抽出できません。以下のコードのようなsscanfの使い方は間違っているのでしょうか?正しく動作するにはどうすればよいか、教えて下さい。 ---------- 以下、ソースコード #include <stdio.h> #include <string.h> int main(void) {  FILE *fp;  char *fname = "test.csv";  char s1[32], s2[16];  int ret;  char str[128];    /* csvファイルの一行 */  char structName[32];  /* セパレータ名 */  fp = fopen( fname, "r" );  if( fp == NULL ){   printf( "%sファイルが開けません\n", fname );   return -1;  }  while( fgets( str, 128, fp ) != NULL ){      /* セパレータ */   if( str[0] == '[' ){    printf( "str = %s\n", str );    ret = sscanf( str, "[%s]\n", structName );    printf( "structName = %s\n", structName );    continue;   }      ret = sscanf( str, "%[^,],%[^,]", s1, s2 );      printf( "s1 = %s\n", s1 );   printf( "s2 = %s\n", s2 );  }  fclose( fp );  return ret; } ---------- 以下、"test.csv"の中身 [ABC] test01,10,11,1.0,1.1 test02,20,21,2.0,2.1 test03,30,31,3.0,3.1 [DEF] test04,40,41,4.0,4.1 ---------- 以下、実行結果 str = [ABC] structName = ABC] s1 = test01 s2 = 10 s1 = test02 s2 = 20 s1 = test03 s2 = 30 str = [DEF] structName = DEF] s1 = test04 s2 = 40

専門家に質問してみよう