ページ 11

文字列取得

Posted: 2010年5月28日(金) 22:31
by すーん
#define MARK '\"'
//中略//
for(i=0; html[18]!='\0'; i++)
{
if(html[18] == MARK)
{
i++;
while(html[18] != MARK)
{
tag[0][x] = html[18];
i++;
x++;
}
break;
}
}
printf("%s",tag[0]);


HTMLファイルを読み込み
配列htmlに一行ずつ格納してあります。
html[18]はHTMLファイルから読み込んだ18行目の文字列です。
そこで18行目のHTML文を一文字ずつ比較し、
ダブルクォーテンション(")で挟まれている
文字列を取得します。
上記のように記述し実行したところ
tag[0]は空(NULLではない)でした。

おかしいと思い
while(html[18] != MARK)
{
tag[0][x] = html[18];
printf("%c",tag[0][x]);
i++;
x++;
}
このようにwhile文の中に一文字ずつ表示させてみたのですが、
こっちでは正常に表示されました。

これはどういうことでしょうか?
対策方法、なぜこうなるか解説お願いします。

Re:文字列取得

Posted: 2010年5月28日(金) 22:34
by すーん
【HTMLの例】
<meta http-equiv="content-type" content="text/html;charset=shift_jis">

期待する実行結果は
tag[0]=>content-type
となってればいいのですが・・・

Re:文字列取得

Posted: 2010年5月29日(土) 00:55
by nishi
変数xを初期化していますか?

Re:文字列取得

Posted: 2010年5月29日(土) 03:03
by すーん
はい。
もちろんしています。

int x = 0;

Re:文字列取得

Posted: 2010年5月29日(土) 03:18
by ideyan
むむむ……関係あるかわからないけど、
tagに格納された文字列の最後に'\0'を入れてますか?

Re:文字列取得

Posted: 2010年5月29日(土) 03:22
by すーん
いや敢えて
tag[0][x] = '\0'
とはしていません。

Re:文字列取得

Posted: 2010年5月29日(土) 03:59
by Poco
> これはどういうことでしょうか?
> 対策方法、なぜこうなるか解説お願いします。

現状、対策の提示も解説もできません。
現象を再現できるソースコードを提示してください。

Re:文字列取得

Posted: 2010年5月29日(土) 06:17
by toyo
tag[0][x] = '\0'
がないため表示が変になっているのではないでしょうか

Re:文字列取得

Posted: 2010年5月29日(土) 08:06
by ideyan
最後の
printf("%s",tag[0]);


for(i=0;tag[0]!='\0';++i){
printf("%c",tag[0]);
}

として実行するとどうなりますか?

Re:文字列取得

Posted: 2010年5月29日(土) 08:32
by box
質問者さんが

>いや敢えて
>tag[0][x] = '\0'
>とはしていません。

と書かれている以上、

>printf("%s",tag[0]);

>for(i=0;tag[0]!='\0';++i){
> printf("%c",tag[0]);
>}
も、

tag[/url][/url]の定義範囲を超えてしまったとしても
'\0'が見つかるまで表示し続ける、という意味においては
同じだと思います。

Re:文字列取得

Posted: 2010年5月29日(土) 15:44
by Poco
少なくとも、下記ソースコードではtagの値は"content-type"になっています。
これは、すーんさんが提示したソースコードと入力データを使用しています。

つまり、すーんさんが提示した範囲には何の問題も無い、というのが私の見解です。
もう一度言いますが、現象を再現できるソースコードを提示してください。

----hoge.cpp
#include <stdio.h>

#define MARK '\"'

char html[/url] = "<meta http-equiv=\"content-type\" content=\"text/html;charset=shift_jis\">";
char tag[sizeof( html )];

int main()
{
for ( int i = 0, x = 0; html != '\0'; i++ ) {
if ( html == MARK ) {
i++;
while ( html != MARK ) {
tag[x++] = html[i++];
}
break;
}
}
printf("%s",tag);
}