C言語関係掲示板

過去ログ

No.578.sscanfを使って文字列の取り出し

[戻る] [ホームページ]
No.5373

sscanfを使って文字列の取り出し
投稿者---一歩ずつ(2003/02/25 21:21:05)


sscanfを使って以下の様な文字列から文字列を取り出したい
のですが上手くできません。
1回だけのsscanfの実行で取り出したかったのですが上手く
いきません。
sscanfでは無理があるのでしょうか。
sscanfである部分を取り出し、プログラムで処理をした方が
よいのでしょうか。
過去ログにsscanfについての書き込みがあり参考にしたのですが
駄目でした。
教えて下さい。

**** 社員ユーザ 一覧リスト ****

**** 非社員ユーザ 一覧リスト ****

**** 非社員ユーザ から 社員ユーザ への変更リスト ****

で、
ここから、「社員ユーザ」と「非社員ユーザ」と「非社員ユーザ から 社員ユーザ」
というのと取り出したいのですが、

sscanf(buf,"---- %[^- ]s %s %s %[^ -]", str1,str2,str3) ;
sscanf(buf,"---- %[^- ]s", str)
if (sscanf(buf,"---- %[^- ]s",str)==1 || sscanf(buf,"---- %[^- ]s %s %s %[^ -]", str1,str2,str3)==3)

と、やってみたのですが上手く行きませんでした。
お願いします。



No.5378

Re:sscanfを使って文字列の取り出し
投稿者---a(2003/02/26 01:19:08)


>**** 非社員ユーザ から 社員ユーザ への変更リスト ****
中間の空文字が邪魔なので
**** 非社員ユーザから社員ユーザへの変更リスト ****
に変更して
    char list[siz][256]={
        "**** 社員ユーザ 一覧リスト ****",
        "**** 非社員ユーザ 一覧リスト ****",
        "**** 非社員ユーザから社員ユーザ への変更リスト ****"
    };
    char buf[siz][256];
    int i;    
    for(i=0;i<siz;i++){
        sscanf(list[i],"%*s%s",buf[i]);
            
    }
    for(i=0;i<siz;i++)
        printf("%s\n",buf[i]);

(ただ勉強不足...)
もし、c++だったら変更しないでもこんな感じでいけるんですけどね
#include <cstdio>
#include <string>
#include <algorithm>
int main(){
    const int siz=3;
    std::string list[siz]={
        "**** 社員ユーザ 一覧リスト ****",
        "**** 非社員ユーザ 一覧リスト ****",
        "**** 非社員ユーザ から 社員ユーザ への変更リスト ****"
    };
    std::string buf[siz];
    int i;    
    for(i=0;i<siz;i++){
        buf[i].insert(buf[i].begin(),list[i].begin()+list[i].find(" ")+1,
            std::find(std::find(list[i].rbegin(),list[i].rend(),' ')+1,list[i].rend(),' ').base() );
            
    }
    for(i=0;i<siz;i++)
        printf("%s\n",buf[i].c_str());
    return 0;
}



No.5379

Re:sscanfを使って文字列の取り出し
投稿者---a"(2003/02/26 01:41:25)


これでできました。
#define siz 3

    char list[siz][256]={
        "**** 社員ユーザ 一覧リスト ****",
        "**** 非社員ユーザ 一覧リスト ****",
        "**** 非社員ユーザ から 社員ユーザ への変更リスト ****"
    };
    char buf[siz][256];
    int i,k;char *p;
    for(i=0;i<siz;i++){
        if(i==2){
            strtok(list[i]," ");*buf[i]=0;
            for(k=0;k<3;k++){
                p=strtok(0," ");
                strcat(buf[i],p);
            }
            break;
        }
        sscanf(list[i],"%*s%s",buf[i]);
            
    }
    for(i=0;i<siz;i++)
        printf("%s\n",buf[i]);


No.5388

ありがとうございます。
投稿者---一歩ずつ(2003/02/26 09:19:31)


ありがとうございます。
ためしてみます。


No.5399

Re:ありがとうございます。
投稿者---a(2003/02/27 00:25:23)


強引ついでに
   for(i=0;i<siz;i++){
       
        sscanf(list[i],"%*s%*c%[非社員ユーザから ]",buf[i]);
      buf[i][strlen(buf[i])-1]=0;
            
    }