ページ 11

ダブルクォーテーションを含まずに文字列を読み取る方法について

Posted: 2016年1月04日(月) 00:33
by マサ
初投稿です。

C/C++とOpenGLを使いxファイルを表示するプログラムを作っているのですが、テクスチャファイルを指定する方法でつまずいています。
xファイルのなかに
TextureFilename {
"hoge.bmp";
}
とモデルのテクスチャファイルを指定する記述があると思います。

今は、テクスチャ名の部分まで読み飛ばし
char name[256];
fscanf_s(xFile, "%s", &name, sizeof(name));
のような感じでテクスチャ名を読み込んでいるのですが、printfでnameを出力してみると"hoge.bmp";と表示されます。(この記述なら当然ですよね)

\"を使ってみたりしましたが「フフフフフ・」が表示されたり、"hoge.bmp";のままだったりします。
ダブルクォーテーションを含まずテクスチャ名(文字列)を読み込むにはどうすればいいのでしょうか。

初歩的な質問かつ分かりづらい説明だと思いますがご教授願えたら幸いです。

Re: ダブルクォーテーションを含まずに文字列を読み取る方法について

Posted: 2016年1月04日(月) 00:40
by かずま
マサ さんが書きました: ダブルクォーテーションを含まずテクスチャ名(文字列)を読み込むにはどうすればいいのでしょうか。
scanf の書式を " \"%[^\"]" とすればよいでしょう。

Re: ダブルクォーテーションを含まずに文字列を読み取る方法について

Posted: 2016年1月04日(月) 08:13
by みけCAT
オフトピック
マサ さんが書きました:今は、テクスチャ名の部分まで読み飛ばし
char name[256];
fscanf_s(xFile, "%s", &name, sizeof(name));
のような感じでテクスチャ名を読み込んでいるのですが、
まず、&nameではなくnameとするべきです。
fscanfに誤った型のデータを渡すとundefined behaviorになります。
fscanf_sでもあまり良くない気がします。

…というのはC言語での話で、
scanf 関数の型フィールド文字によればVisual Studio言語のscanf系関数のsは配列が必要なので&nameが正しいのかな?
そもそも「配列の先頭要素へのポインタ」も「配列へのポインタ」もC言語では配列ではないのだけど…Visual Studio言語では違うのかな?

Re: ダブルクォーテーションを含まずに文字列を読み取る方法について

Posted: 2016年1月04日(月) 19:12
by マサ
お二方とも迅速な返信をして頂きありがとうございます。

かずまさんへ
返信の内容を試したところ、問題なくテクスチャ名が読み込めました。
適切な回答ありがとうございました。

みけCATさんへ
配列なら&なしでもエラーにならないんですね。
普通の変数で読み込んでた頃、よく&を付け忘れてエラーが出ていたので付けておくものだと思っていました。

また質問をすることがあるかもしれませんが、その時もどうかよろしくお願いします。