文字列取得

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
すーん

文字列取得

#1

投稿記事 by すーん » 15年前

#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:文字列取得

#2

投稿記事 by すーん » 15年前

【HTMLの例】
<meta http-equiv="content-type" content="text/html;charset=shift_jis">

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

nishi

Re:文字列取得

#3

投稿記事 by nishi » 15年前

変数xを初期化していますか?

すーん

Re:文字列取得

#4

投稿記事 by すーん » 15年前

はい。
もちろんしています。

int x = 0;

ideyan

Re:文字列取得

#5

投稿記事 by ideyan » 15年前

むむむ……関係あるかわからないけど、
tagに格納された文字列の最後に'\0'を入れてますか?

すーん

Re:文字列取得

#6

投稿記事 by すーん » 15年前

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

Poco

Re:文字列取得

#7

投稿記事 by Poco » 15年前

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

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

toyo

Re:文字列取得

#8

投稿記事 by toyo » 15年前

tag[0][x] = '\0'
がないため表示が変になっているのではないでしょうか

ideyan

Re:文字列取得

#9

投稿記事 by ideyan » 15年前

最後の
printf("%s",tag[0]);


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

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

box

Re:文字列取得

#10

投稿記事 by box » 15年前

質問者さんが

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

と書かれている以上、

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

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

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

Poco

Re:文字列取得

#11

投稿記事 by Poco » 15年前

少なくとも、下記ソースコードでは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);
}

閉鎖

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