Python で printf() が奇妙な出力を出すのはなぜですか? 質問する

Python で printf() が奇妙な出力を出すのはなぜですか? 質問する

printf()Linux の Python コマンドラインでC 関数を使用しようとしました。これを機能させるために、 をインポートしましたctypes。問題は、 のオブジェクトを作成してループで - 関数CDLLを使用するとprintf()、非常に奇妙な出力が得られることです。

>>> import ctypes
>>> libc = ctypes.CDLL("libc.so.6")
>>> for i in range(10):
...     libc.printf("%d", i)
...
01
11
21
31
41
51
61
71
81
91
>>>

ただし、関数内でこのループを呼び出すと、期待どおりに動作します。

>>> import ctypes
>>> libc = ctypes.CDLL("libc.so.6")
>>> def pr():
...     for i in range(10):
...         libc.printf("%d", i)
...     libc.printf("\n")
...
>>> pr()
0123456789
>>>

この動作の原因が何なのかは推測できません...
問題があれば、Linux で Python 2.7.6 を使用しています。

編集:

Python のバージョンやオペレーティング システムはこれに影響を与えません。詳細については、以下の PM 2Ring の回答を参照してください。Windows では、 の初期化をlibcに変更するだけで済みますlibc = ctypes.CDLL("msvcrt.dll")( は.dllオプションです)。関数を呼び出す以外に正しい出力を得るための別の方法は、 の戻り値をprintf()変数に格納することです。

>>> import ctypes
>>> libc = ctypes.CDLL("libc.so.6")  # "mscvrt.dll" on windows
>>> for i in range(10):
...     r = libc.printf("%d", i)
...
0123456789>>>

終了時の改行を簡単に追加できるため、私は依然としてこの機能を好みます。

ベストアンサー1

'1'各数値の末尾にある余分な はからの戻り値でありprintf、出力される文字数を返します。対話型インタープリタで呼び出された関数の戻り値は自動的に出力されます ( でない限りNone)。

実際、対話型インタープリタは、None割り当てられていない式以外のすべてを出力します。そしてもちろん、それらの式に改行が追加されます。これが、最初のコード ブロックの出力が別々の行にある理由です。

関数prには return ステートメントがないので、 が返されNone、余分なものは印刷されません。

おすすめ記事