0

我想用 Visual Studio 2010 为 php 创建一个扩展,我是 C++ 的初学者。
我在 C++ 中的最后一个函数是:

PHP_FUNCTION(DoubleUp){
    char* text;
    int len;
    char string[255];
    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &text) == FAILURE) {
        RETURN_STRING("Invalid Parameters",true);
    } 
      len = sprintf(string,"echo 'hello %.78s'", text);
      RETURN_STRINGL(string,len, 1);
}

在 php 中我使用:

echo DoubleUp('sss');

但输出是:echo 'hello Ыõ'
应该是:echo 'hello sss'
参数是一个很长的字符串。
现在我不知道该怎么办。谢谢 ...

4

1 回答 1

2

您的代码的问题是,如果您在“类型说明符”(的第三个参数)中指定,则zend_parse_parameters返回 a 。zval"z"zend_parse_parameters

要获取正确的字符串,您可以使用“s”直接获取字符串:

if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &text, &len) == FAILURE) {

在这种情况下,您必须提供指向char*字符串的指针加上指向 an 的指针以int保存字符串长度。

第二种解决方案是zval正确使用并将字符串从zval:

zval* text;
int len;
char string[255]      
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &text) == FAILURE) { 
    /* ... */ 
}

// cast the value to string
convert_to_string(text);

// get the string value with the Z_STRVAL_P macro (Z_STRLEN_P for the length)
len = sprintf(string,"echo 'hello %.78s'", Z_STRVAL_P(text));
于 2012-09-05T12:56:10.907 回答