php — изменение регистра возвращаемой строки в PHP_FUNCTION () Переполнение стека

Я хочу создать расширение для PHP с Visual Studio 2010, я новичок в 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'
Аргумент — это очень длинная строка.
Теперь я не знаю, что мне делать.
Спасибо …

0

Решение

Проблема с вашим кодом в том, что zend_parse_parameters возвращает zval если вы укажете "z" в «спецификаторе типа» (третий параметр zend_parse_parameters).

Чтобы получить правильную строку, вы можете получить строку напрямую, используя «s»:

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

В этом случае вы должны указать указатель на char* для строки плюс указатель на 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));
2

Другие решения

Других решений пока нет …