Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ctypes在Python解释器中的行为异常_Python_Ctypes - Fatal编程技术网

ctypes在Python解释器中的行为异常

ctypes在Python解释器中的行为异常,python,ctypes,Python,Ctypes,我对ctypes有一个有趣的问题;虽然它似乎在常规python脚本中工作,但当我在带printf()的解释器中使用它时,它会在字符串本身之后打印字符串的长度。演示: Python 2.6.5 (r265:79063, Apr 16 2010, 13:09:56) [GCC 4.4.3] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> from ctypes

我对ctypes有一个有趣的问题;虽然它似乎在常规python脚本中工作,但当我在带printf()的解释器中使用它时,它会在字符串本身之后打印字符串的长度。演示:

Python 2.6.5 (r265:79063, Apr 16 2010, 13:09:56) 
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from ctypes import *
>>> libc = CDLL("libc.so.6")
>>> libc.printf("Test")
Test4
>>> int = 55
>>> libc.printf("Test %d", int)
Test 557
>>> int = c_int(55)
>>> libc.printf("Test %d", int)
Test 557
有人知道为什么会发生这种情况吗?

从printf(3)手册页:

成功返回后,这些函数返回打印的字符数(不包括用于结束字符串输出的尾随
'\0'

python解释器在调用后显示
printf()
的返回代码。由于字符串末尾没有换行符
\n
,因此打印输出后会立即打印长度。请注意,这不会发生在脚本中,只有在以交互方式使用python时才会发生

您可以通过分配来隐藏此内容:

ret = libc.printf("Test\n")

奇怪的是,将python str传递给需要char*的函数是否危险?是的,如果函数需要修改字符串的内容。Python字符串是不可变的。ctypes有一个create_string_buffer()函数来创建可以修改的字符数组。请注意,
int
不是保留字,实际上是一个内置属性。你不应该养成给它分配引用的习惯。我知道,但这只是一个小的解释器测试。