2011-10-21 6 views
0

printfは出力ストリームに出力された文字を返すので、なぜそれがcの変数の長さを見つけるのに使わないのでしょうか?変数の長さを見つけるのに1つのライナー

コードはこのような何かを行く、

#include<stdio.h> 
int main() 
{ 
char *a="Length"; 
int i=1000; 
printf("Size: %d\n",printf("%d\n",i)-1); 
printf("String Size: %d",printf("%s\n",a)-1); 
return 1; 
} 

は、私は右ですか?私はそれがどこで使われているのか心配していません。私の理解が正しいかどうかを知りたかっただけです。

+1

それは動作しますしかし、それは非効率的であり、 stdoutに偽の出力を生成します。 –

+1

変数の値の印刷表現の長さを返します。また、printfには副作用があります:それは物事を印刷します:)それで、長さを計算するために、側の効果がない関数ほどきれいではありません。 – lkuty

+0

@ルドヴィッチキュート:同意。しかし、私はそれが長さを見つける必要がある変数を印刷する関数を持っていると言うことができます。私は上のスニペットで行っている変数とその長さを表示します。だからこの場合、きれいなコードを書くことはまだ問題になっていますか? – Ajai

答えて

3

「任意の変数の長さ」とはどういう意味ですか?変数を格納するために使用されるバイト数(sizeofstrlen関数でよりうまく達成されます)または変数の文字列表現のバイト長を意味しますか?

フォーマットオプションを使用して結果を実際に変更できるので、後者の場合は注意が必要です。次の例を考えてみましょう:

float num = 10.0f; 
printf("%.10f", num); // return value should be 13 
printf("%f", num); // return value depends on the implementation of printf and the float value supplied 

また、小数点以外の表現もあると考える必要があります。

すでに述べたように、printfには実際にstdoutに書き込む副作用があります。あなたはこれをしたくない場合は、バッファにないstdoutへの書き込みにsnprintfを使用することができます。

char buffer[256]; 
int x = 10; 
snprintf(buffer, sizeof(buffer), "%d", x); // return value is '2' 
0

「変数の長さを見つけるための一つのライナー」

ない可能コンパイラへの組み込みのない限り、 、または参照(...あなたがのsizeofで使用することはできません)...文字列については、

をあなたのタイプを述べるために、いくつかのenumsとページの長い野生の毛深いマクロ半分を定義します。https://stackoverflow.com/a/22128415/3370790

関連する問題