文字列からURLを切り出す

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
rozeo
記事: 86
登録日時: 12年前
住所: 広島 呉 (学生寮
連絡を取る:

文字列からURLを切り出す

#1

投稿記事 by rozeo » 11年前

こんにちは、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で表示できるので、一体どこが間違っているのでしょうか?

ご鞭撻お願いします。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 文字列からURLを切り出す

#2

投稿記事 by みけCAT » 11年前

sscanfのフォーマット文字列が違います。
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で殴ればいい!(死亡フラグ)

rozeo
記事: 86
登録日時: 12年前
住所: 広島 呉 (学生寮
連絡を取る:

Re: 文字列からURLを切り出す

#3

投稿記事 by rozeo » 11年前

C++でコンパイルしているのでsscanfをsscanfに変えてコンパイルしたらうまくいきました。
sscanfで文字列を切り取るだけでは終端文字が含まれないことを忘れていました。

あともうひとつ質問ですがフォーマット文字列の
%[^¥"]
の部分は一体どういう意味、どういう働きをするのでしょうか?

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 文字列からURLを切り出す

#4

投稿記事 by みけCAT » 11年前

rozeo さんが書きました:C++でコンパイルしているのでsscanfをsscanfに変えてコンパイルしたらうまくいきました。
sscanfで文字列を切り取るだけでは終端文字が含まれないことを忘れていました。
変わっていないように見えるのですが、どういう意味ですか?
rozeo さんが書きました:あともうひとつ質問ですがフォーマット文字列の
%[^¥"]
の部分は一体どういう意味、どういう働きをするのでしょうか?
「¥または"が現れる直前までの文字列を読み込む」という働きをします。(¥はC言語/C++のエスケープに使えない記号であることに注意)
¥は1バイトで表せないので、もしかしたら別の動作になるかもしれません。別の動作になります。
例えばIdeone.com(UTF-8)で試したところ、¥(U+00A5)だけでなく¦(U+00A6)の直前でも切られました。
https://ideone.com/TTUtz9
すなわち、このフォーマット文字列がUTF-8である場合、
「\xC2または\xA5または"が現れる直前までの文字列を読み込む」という働きになると思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

rozeo
記事: 86
登録日時: 12年前
住所: 広島 呉 (学生寮
連絡を取る:

Re: 文字列からURLを切り出す

#5

投稿記事 by rozeo » 11年前

携帯から投稿したため¥が\に自動で変換されませんでした。すいません。

あとsscanfではなくsscanf_sの間違いでした。

rozeo
記事: 86
登録日時: 12年前
住所: 広島 呉 (学生寮
連絡を取る:

Re: 文字列からURLを切り出す

#6

投稿記事 by rozeo » 11年前

%[^\"]
についてわかりました。
これで先に進めます。
ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る