scanf, printf
書式付出力(printf 系)
変換文字列の書式は以下の形式である.printf
scanfではこうなる。
% [フラグ][フィールド幅].[精度][h/l/L修飾][変換文字]
% [代入抑止][フィールド幅][h/l/L修飾][変換文字]
例 sprintf(fl, %06f, (double)a); //1.2345 12.345 0034.6 sprintf(fl, %*s, a, b); //a=5 b=' ' fl=' '; (five brankspace) sprintf(fl, %.0f, a); //a=56.4878 fl=56; sscanf(text, %*3c%4f, &floatNum); //text="ABb5.85" floatNum = 5.85; //%1.2fと指定していないのに注意 sscanf(text, %6lf, &doubleNum); //scanf系はdoubleのときfでなく、lfを使う。 //%06lfとしても、0に何の意味もない。
C++では、こういうのもあり。
#include//<--忘れずに。 string items[i]="178.45 876"; double a; int b; ostringstream ss; //ss(str)とかしなくてよい. ss << anslen << " "; res = ss.str(); ちなみに、string str ( ) const; //で、戻り値はconst型でないので、注意.
string a, b; istringstream iss(attendees[i]); iss >> a >> b;
string s = "TU @ 77"みたいな形式のとき、数字の扱いはどうなるかを試してみる. vectorC(sz, 0); vector E(sz, ""); for(int i = 0; i < sz; i++) { stringstream iss(inequalities[i]); string var; iss >> E[i] >> var >> C[i]; //OK //C[i]の部分はしっかりとint型に直してくれている.
//不定の個数の英語の文章をword毎に区切って読み取りたい //http://www.cplusplus.com/reference/iostream/istringstream/参照 string a = "aaa bbb ccc ddd eee fff gggg"; istringstream iss; iss.str(a); //istringstream iss(a); でももちろんOK while(1) { string s; iss >> s; if(s != "") { cout << s << endl; } else { break; } } //もしくは、 int main() { string a = "aaa bbb ccc ddd eee fff gggg"; istringstream iss(a); string s; while(iss >> s) { cout << s << endl; } } //こっちのほうがスマートなので、こっち使おう。
//カンマ区切りのときは置き換えをしてから読み取る。 for(int i = 0; i < sz; i++) { if(item[i] == ',') { item[i] = ' '; } } //もしくは replace をつかう。 replace(str.begin(), str.end(), ',', ' '); //[,]-->[ ]とすることができない時は、getlineを使うとよさげ while( getline(iss, str, ',') ) { istringstream issline(str); string tmp; while(issline >> tmp ) { ... } } //区切りが一つとか二つとか大したことない時はsubstrを使うのが簡単。 for(int i = 0; i < sz; i++) { int pos = placeboard[i].find('-'); string name = placeboard[i].substr(0, pos); string position = placeboard[i].substr(pos+1); }
//オブジェクト指向ライクな書き方なら、 s.str(""); //は望ましくない。 もうひとつオブジェクトを作った方がよい。 istringstream issa(a); ... istringstream issb(b); ...