作者:虚坏叔叔

早餐店不会开到晚上,想吃的人早就来了!😄

​Python​​​通过​​create_string_buffer​​​给​​c语言​​传递可修改字符串

一、测试字符串在c语言中修改后 会否影响Python

​string​​​和​​byte​​​在​​Python​​​中不支持修改,但是,如果传递到​​c​​语言中要能不能被修改,实测时发现是可以修改的。

可以来修改试一试,只针对于​​byte​​类型,

在​​Python​​中打印提示:

print(“in python str1=”, str1)

print("Test Ctypes")
from ctypes import *

#导入库 windows中dll后缀名不用加
lib = CDLL("C:\\Users\\Administrator\\Desktop\\testctypes\\x64\\Debug\\testctypes")

try:
str1 = b"test string in python"
lib.TestStringA(str1, len(str1))
print("in python str1=", str1)

wstr = "wide string in python"
lib.TestStringW(wstr, len(wstr))
except Exception as ex:
print("testCtypes Error", ex)
# 等待用户输入,程序不退出
input()

在​​C++​​中修改传递过来的字符:

str[0] = ‘@’;

//  c_char_p
XLIB void TestStringA(char *str, int size) {
str[0] = '@';
printf("TestStringA : %s (%d)\n", str, size);
}

运行 可以发现第一个字符被修改了。

Python&C++相互混合调用编程全面实战-06Python通过create_string_buffer给c语言传递可修改字符串_开发语言

所以,这只能是约定,按照默认的约定,​​Python​​​中不支持被修改,那么在​​C++​​中,也不应该被修改。这是约定,起不到强制作用。

二、明示调用 create_string_buffer,字符串可被改变

按照约定,如果你想让传递进去的字符串可以被修改。

在​​Python​​中可以调用函数:

#定义需要更改

buf = create_string_buffer(100)

lib.TestStringBuffer(buf)

print(“in python buf=”, buf.raw, buf.value, len(buf))

在​​C++​​添加一个可以被修改的函数:

//  c_char_p
XLIB void TestStringBuffer(char *str, int size) {

str[0] = '@';
str[1] = '#';
str[2] = '\0';
printf("TestStringBuffer : %s (%d)\n", str, size);
}

运行

可以看到,​​流​​​ ​​内容​​​ ​​长度​​都输出来了

Python&C++相互混合调用编程全面实战-06Python通过create_string_buffer给c语言传递可修改字符串_开发语言_02

三、总结

  • 本文使用QT创建了项目,并且这个项目也能在Visual studio中正常运行 。
  • 下节课会讲解QT源码方面的知识