2

我正在使用 exec() 从 php 脚本调用带有 main() 函数的可执行文件。哪个工作正常,但返回所有 printf() 值,而不是只返回数组:

主.cpp:

#include<stdio.h>
#include<string.h>
#include "foo.h"
int main(int argc, char *argv[] )
{
    char buffer[1024];
    char *ch;
    static int ar[2];
    strcpy(buffer,argv[1]);
    printf("Client : \n");
    if ( argc != 2 ) /* argc should be 2 for correct execution */
    {
              printf( "\n%s filename\n", argv[0] );
    }
    else 
    {
        printf("\nstring is :%s \n",buffer);
    ch=foo(buffer);
    ar[0]=((int*)ch)[0];
    ar[1]=((int*)ch)[1];
    printf("Counts is :%d  %d \n",ar[0],ar[1]);
    }
    return (int)ar;

}

我的 test.php

<?php
$s="critic worst";
escapeshellarg($s);
$a=array(shell_exec('/home/technoworld/Videos/LinSocket/client "nice bad"'));
print_r($a[0]);
//echo exec('whoami');
?>

显示输出:

Client : string is :nice bad Positive count: 2 Negative count: 2 array item2 2 Count is :2 2

我还尝试了 exec() ,它也给出了相同的概率。任何人都可以建议如何从 main.cpp 获取 ar[0] 和 ar[1] 吗?

Client : string is :nice bad Positive count: 2 Negative count: 2 array item2 2 

这是来自 foo.cpp 文件中的所有 printf() 。

当我使用 exec() 然后它给出Count is :2 2

如何获得准确的 ar[0] 和 ar[1]

4

3 回答 3

2

感谢埃利亚斯的帮助。这是解决方案:

<?php

if (preg_match_all('/[^=]*\=([^;@]*)/', shell_exec('/home/technoworld/Videos/LinSocket/client "nice bad worst good"'), $matches))
{
   $x = (int) $matches[1][0];//optionally cast to int
   $y = (int) $matches[1][1];
   echo $x. '<br/>'. $y. '<br/>'
}

?>

$x,$y分别包含 ar[0] 和 ar[1]

于 2013-07-08T15:02:32.110 回答
2

也许只是简单

preg_match('/[0-9]*/', $output, $matches);

如果我没错的话...

为了确定:

preg_match('Counts is :([0-9]*)[^0-9]*([0-9]*)/',$output,$matches);

还可以看看这个问题,了解如何以交互方式使用 PHP 和 C(++)

一个快速而笨拙的丑陋凌乱的解决方法可能是:

printf("%d",ar[0]);
return ar[1];//end main function

然后,在您的 PHP 脚本中:

$a = array(shell_exec('/home/technoworld/Videos/LinSocket/client "nice bad"'),
           shel_exec('echo $?');
);

然后从输出字符串中获取最后一个数值, (preg_match('/([0-9]*)\w*$/',$a[0],$matches);应该这样做,并且$a[1]将包含ar[1]main.cpp 文件的值,因为那是退出代码。请注意,退出代码不是用于 show。表示某些东西!更改它们通常是一个坏主意。我只需更改我的 main.cpp,并添加以下行:

printf("@ar[0]=%d;ar[1]=%d@",ar[0],ar[1]);

这将打印一个格式清晰的字符串,使用正则表达式很容易解析。假设*ar分别持有值 123 和 456:

preg_match_all('/\]\=([^;@]*)/',$a[0],$matches);
var_dump($matches[1]);//[123,456]

或者更好:

$parts = explode('@', $a[0]);
echo $parts[1];//ar[0]=123;ar[1]=456

底线:

将此添加到main.cppmain中的函数:

printf("@ar[0]=%d;ar[1]=%d@",ar[0],ar[1]);

并且,要在 php 中获取 int 值:

$a = array(shell_exec('..'));
preg_match_all('/[^=]*\=([^;@]*)/',$a[0],$matches);
var_dump($matches[1]);

那应该这样做。

$a = array();
$b = array();
if (preg_match_all('/[^=]*\=([^;@]*)/', shell_exec('your command'), $matches))
{
   $a[] = (int) $matches[1][0];//optionally cast to int
   $b[] = (int) $matches[1][1];
}

就是这样......不知道为什么$a$b需要是数组,但这可能是因为你要调用clientbin 几次。

于 2013-07-08T09:36:04.697 回答
1

这也将起作用:

if (preg_match_all('/[^=]*=([^;@]*)/', shell_exec("/home/technoworld/Videos/LinSocket/client '$s'"), $matches)) //Values stored in ma.
{
    $x = (int) $matches[1][0];  //optionally cast to int
    $y = (int) $matches[1][1];
}

echo "<br/>"; echo "Positive count :$x";
echo "<br/>"; echo "Negative count :$y"; echo "<br/>";
于 2013-07-14T06:11:36.653 回答