質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

openFrameworks

openFrameworksは、C++で記述されたライブラリ群です。既存のライブラリの設定なしで使用できるため「糊」のようなツールキットと呼ばれています。簡単なコードだけで様々なグラフィックスやインタラクションをデザインすることが可能です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

4390閲覧

空白のあるstring(char)情報を読み込む方法

seri

総合スコア422

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

openFrameworks

openFrameworksは、C++で記述されたライブラリ群です。既存のライブラリの設定なしで使用できるため「糊」のようなツールキットと呼ばれています。簡単なコードだけで様々なグラフィックスやインタラクションをデザインすることが可能です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2016/12/10 20:27

編集2016/12/10 20:31
頂点情報 v -0.131961 1.533305 -0.207426 v -0.131961 -1.533305 -0.207426

があるとします、この情報を抜き取って三次元ベクトルに格納したい場合の処理がうまくいっていません。

c++

1 string c = buff.getNextLine();//ここで↑の頂点情報がstring型のcに格納されます。 2 3 ofVec3f vertex;//3次元ベクトルです 4 while(...){ //条件式 5 if (strncmp(c.c_str(),"v",1)==0) { 6 scanf(c.c_str(), "%f %f %f", &vertex.x, &vertex.y, &vertex.z);//ここでエラーがでます。 7 } 8 c = buff.getNextLine(); 9 } 10}

開発環境から、見慣れない関数もあるかと思いますが、ご了承ください。

ここでは、String型cをchar型に変え、最初の文字がvの場合scanf関数によってvertexの各座標に頂点情報を格納しています。
その際、scanfをしている箇所で無限ループに陥ります、おそらく表記が間違っているのかと思うのですが、原因がわかりません、、

追記:このコードだと、vertexとゆうベクトルに1つしか値が格納されませんが、質問として見やすいため、意図的に簡略化しているだけです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

  1. scanfはsscanfの間違い

scanfは標準入力から読み込む関数で、文字列から読み込むならsscanfが適切だと思います。
無限ループに見えたのは「標準入力からの入力待ちになっていただけ」だと思います。
2. sscanfで読み込むバッファー位置
sscanfの第一引数は質問コードのままだと"v ..."になります。そこから浮動小数点数3つを読み込もうとしても先頭が"v "なので期待通り読めません。それら2文字をスキップした位置から読み込ませないといけないです。
sscanf(c.c_str() + 2, "%f %f %f", &vertex.x, &vertex.y, &vertex.z);
3. 結果不正を防ぐために
2で先頭から2文字スキップさせるので、比較の際の文字列は"v"じゃなく"v "としたいところです。
if (strncmp(c.c_str(), "v ", 2) == 0)
"v-1.0 1.0 1.0"などのように空白を書き忘れたときにエラーにならずに1.0 1.0 1.0という間違ったデータが読めてしまうからです。

投稿2016/12/11 04:35

KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

んー... 僕ならこんなカンジかな。

C++

1#include <iostream> 2#include <sstream> 3#include <string> 4 5using namespace std; 6 7string getNextLine() { 8 static const char* data[] = { 9 "k -0.131961 -1.533305 -0.207426", 10 "v -0.131961 1.533305 -0.207426", 11 "k -0.131961 1.533305 -0.207426", 12 "v -0.131961 -1.533305 -0.207426", 13 nullptr 14 }; 15 static int count = 0; 16 const char* str = data[count++]; 17 return str == nullptr ? string() : string(str); 18} 19 20int main(){ 21 string line; 22 while ( !(line = getNextLine()).empty() ) { 23 istringstream stream(line); 24 char key; 25 double x, y, z; 26 stream >> key; 27 if ( key != 'v' ) cerr << "skip." << endl; 28 else { 29 stream >> x >> y >> z; 30 cout << '(' << x << ',' << y << ',' << z << ')' << endl; 31 } 32 } 33}

投稿2016/12/11 02:32

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

c.c_str()は使いませんでしが、scanfにて1ライン読み込み後に判定するのはどうでしょうか?

c

1char vchr[2]; 2scanf("%s %f %f %f", &vchr, &vertex.x, &vertex.y, &vertex.z); 3if (strncmp(&vchr,"v",1)==0) { 4 5}

投稿2016/12/11 01:18

A.Ichi

総合スコア4070

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問