ここから本文です

文字数などが一定ではないとある文字列から部分を取り出す方法はありませんか? ...

tou********さん

2012/7/1822:10:39

文字数などが一定ではないとある文字列から部分を取り出す方法はありませんか?
使用言語はC++(VisualStudio2010)です。

char buf[64]
↑この中に↓のような文字列が次々格納されていきます(○つめ・・・という表現は区切りをわかりやすくしたもので実際に入っている文字列ではありません)
1つめ・・・ID="1234" PASS="aiueo"
2つめ・・・Namae="Tanaka Taro" Age="20"
3つめ・・・Namae="Suzuki Ennnosuke" Age="19"
4つめ・・・ID="34982" PASS="oeuia"
5(略
のNamaeのカッコの中にある「Tanaka Taro」や「Suzuki Ennnosuke」の部分だけを取り出したいのですが、Namae付きの文字列が格納される順番や目的の文字数が一定ではないのでなかなかうまくいきません

閲覧数:
193
回答数:
2

違反報告

ベストアンサーに選ばれた回答

rea********さん

2012/7/1823:30:05

・Namae="を検索し、見つかれば次の"までを取り出す。
#include <iostream>
#include <sstream>
using namespace std;

int main(void ){
char buf[][64]={{"ID=\"1234\" PASS=\"aiueo\""},
{"Namae=\"Tanaka Taro\" Age=\"20\""},
{"Namae=\"Suzuki Ennnosuke\" Age=\"19\""},
{"ID=\"34982\" PASS=\"oeuia\""}
};

string str,substr;
unsigned int idx,idx2;
int i;

for(i=0;i<4;i++){
str=buf[i];
idx = str.find( "Namae=\"" );
if(idx == string::npos ){ /* namaeなし */
continue;
}
idx+=+string("Namae=\"").length();
idx2 = str.find( "\"",idx );
substr= str.substr(idx, idx2-idx);
cout << substr << endl;
}
}

・"を区切り文字としてデータを取り出す
strtokを使うと、bufの中身は破壊されるので必要ならコピーして使うこと。

#include<stdio.h>
#include <string.h>

int main(void) {

char buf[][64]={{"ID=\"1234\" PASS=\"aiueo\""},
{"Namae=\"Tanaka Taro\" Age=\"20\""},
{"Namae=\"Suzuki Ennnosuke\" Age=\"19\""},
{"ID=\"34982\" PASS=\"oeuia\""}
};
char *ch;
int i;

for(i=0;i<4;i++){
ch = strtok( buf[i],"\"" );
while(ch!=NULL){
if( strcmp(ch, "Namae=" )== 0 ){
ch = strtok(NULL,"\"");
printf("%s\n",ch);
break;
}
ch = strtok(NULL,"\"");
}
}
}

質問した人からのコメント

2012/7/19 00:32:38

成功 即実現して頂いて嬉しい限りです
出来ればどちらにもコインをあげたいところなのですが、仕様上無理みたいなので、二通りの方法をくれて、早かったreal_robot_rさんにベストアンサーを送ります
二週間の悩みがものの数十分で解決しちゃいました!ふたりとも本当にありがとうございました!

ベストアンサー以外の回答

1〜1件/1件中

k03********さん

2012/7/1900:00:41

tou_heaaさん

char *fx(char *r)
{
char name[]="Namae";
int i;
for(i=0;i<5;++i)
{
if(*r != name[i])
return NULL;
++r;
}
return r;
}
int main(void){
char buf[]="ID=\"1234\" PASS=\"aiueo\"Namae=\"Tanaka Taro\" Age=\"20\"Namae=\"Suzuki Ennnosuke\" Age=\"19\"ID=\"34982\" PASS=\"oeuia\"";
char *p,*q;
int k;
printf("%s\n\n",buf);
p=buf;
k=0;
while(*p)
{
if(k==0)
{
q=fx(p);
if(q != NULL)
{
k=1;
p=q;
}
}
else
{
if(*p == '\"')
{
if(k ==1)
k=2;
else
{
printf("\n");
k=0;
}
}
else if(k ==2)
printf("%c",*p);
}
++p;
}
printf("\n");
return 0;
}

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる