こんにちは、rozeoです。
なんとなく気分で、Googleの履歴ログを他のアプリケーションをつかってcsvに変換したものからURLを切り出して出力っていうプログラムを作っていたんですが、URLの切り出しがうまく処理できません。
例)
文字列
"1","http://192.168.0.1/","[認証エラー]","3","3", ... 77","0","0"
から
http://192.168.0.1
のぶぶんだけ切り出す。
これをいったんchar型の配列にfgetsで格納してsscanfのフォーマット文字列に
"\"%d\",\"%s\""
を指定してできるかなってやってみたんですが、"1"の1は切り出せたのにURLの部分は上手く切り出せませんでした。
URLは%sで表示できるので、一体どこが間違っているのでしょうか?
ご鞭撻お願いします。
文字列からURLを切り出す
Re: 文字列からURLを切り出す
sscanfのフォーマット文字列が違います。
strtokを利用するか、自前でパースするべきだと思います。
とりあえずごまかすなら、フォーマットを"\"%d\",\"%[^\"]\""などにする対策でもいいと思います。
strtokを利用するか、自前でパースするべきだと思います。
とりあえずごまかすなら、フォーマットを"\"%d\",\"%[^\"]\""などにする対策でもいいと思います。
#include <stdio.h>
#include <string.h>
int main(void) {
// your code goes here
const char* input="\"1\",\"http://192.168.0.1/\",\"[認証エラー]\",\"3\",\"3\",\"13052137644790577\",\"0\",\"0\"";
char url[1024];
int url_len;
int number;
sscanf(input,"\"%d\",\"%[^\"]\"",&number,url);
/* この時点でurlには"http://192.168.0.1/"が格納されている */
url_len=strlen(url);
if(url_len>0 && url[url_len-1]=='/')url[url_len-1]='\0';
printf("%d %s\n",number,url);
return 0;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 文字列からURLを切り出す
C++でコンパイルしているのでsscanfをsscanfに変えてコンパイルしたらうまくいきました。
sscanfで文字列を切り取るだけでは終端文字が含まれないことを忘れていました。
あともうひとつ質問ですがフォーマット文字列の
%[^¥"]
の部分は一体どういう意味、どういう働きをするのでしょうか?
sscanfで文字列を切り取るだけでは終端文字が含まれないことを忘れていました。
あともうひとつ質問ですがフォーマット文字列の
%[^¥"]
の部分は一体どういう意味、どういう働きをするのでしょうか?
Re: 文字列からURLを切り出す
変わっていないように見えるのですが、どういう意味ですか?rozeo さんが書きました:C++でコンパイルしているのでsscanfをsscanfに変えてコンパイルしたらうまくいきました。
sscanfで文字列を切り取るだけでは終端文字が含まれないことを忘れていました。
「¥または"が現れる直前までの文字列を読み込む」という働きをします。(¥はC言語/C++のエスケープに使えない記号であることに注意)rozeo さんが書きました:あともうひとつ質問ですがフォーマット文字列の
%[^¥"]
の部分は一体どういう意味、どういう働きをするのでしょうか?
¥は1バイトで表せないので、もしかしたら別の動作になるかもしれません。別の動作になります。
例えばIdeone.com(UTF-8)で試したところ、¥(U+00A5)だけでなく¦(U+00A6)の直前でも切られました。
https://ideone.com/TTUtz9
すなわち、このフォーマット文字列がUTF-8である場合、
「\xC2または\xA5または"が現れる直前までの文字列を読み込む」という働きになると思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 文字列からURLを切り出す
携帯から投稿したため¥が\に自動で変換されませんでした。すいません。
あとsscanfではなくsscanf_sの間違いでした。
あとsscanfではなくsscanf_sの間違いでした。
Re: 文字列からURLを切り出す
%[^\"]
についてわかりました。
これで先に進めます。
ありがとうございました。
についてわかりました。
これで先に進めます。
ありがとうございました。