【问题标题】:Maximum string length that can be passed in command line argument?可以在命令行参数中传递的最大字符串长度?
【发布时间】:2013-09-01 07:17:19
【问题描述】:

我已经看到这个问题similar ques for SQL

我将网页内容作为参数传递给 c++ 程序。

我的代码在这里:

<?php
//sent has value "http://www.paulgraham.com/herd.html"
$url=$_POST['sent'];
$text = file_get_contents($url);
$temp=strip_tags($text);
$output=shell_exec("/home/technoworld/Videos/LinSocket/Modular/x '$temp'");
echo $output;
?> 

它只为小内容提供输出。我得到的输出是

most : 1 in : 1 investors : 1 component : 1 2013The : 1 biggest : 1 August : 1 Dynamics : 1 Herd : 1 Investor : 1 Maximum Occurrences Investor Herd Dynamics August 2013The biggest component in most investors 

虽然它实际上显示了每个单词的计数。

当我在命令行中手动执行程序时:

./x "string"

它可以为“http://www.paulgraham.com/herd.html”的第一段提供正确的结果 .但它不会在参数中传递第二个和下一个 para 内容。它只是写在命令行上。

如何在参数中传递这样的内容?对于小内容,它会提供正确的输出。

getconf ARG_MAX

我的系统允许的参数列表是:2097152

【问题讨论】:

  • 作为将整个内容作为参数传递的替代方法,您可以将输出写入文件,然后将文件传递给程序(或者,将文件重定向为输入。例如,编写内容到“tmp.txt”并调用程序,如“./x
  • @Alex:谢谢,但是文件操作对我来说会变得非常昂贵。我必须同时处理大字符串和多个这样的请求!
  • 第一段包含' ,它将结束您的“x”程序的第一个参数。您可以将所有' 替换为'"'"'
  • @BryanOlivier:我在命令行中使用此字符串 The biggest component in most investors' opinion of you 进行了测试。虽然它有',但它一直持续到句子的结尾!
  • @Karimkhan 在这个测试中,你是否用" 包围了字符串?请注意,在您的 PHP 脚本中,您使用 ' 包围字符串。

标签: c++ c command-line-arguments


【解决方案1】:

我已将您的 PHP 程序更改为使用 escapeshellarg,如下所示。我没有测试它,但我的猜测是它会工作

<?php
//sent has value "http://www.paulgraham.com/herd.html"
$url=$_POST['sent'];
$text = file_get_contents($url);
$temp=escapeshellarg(strip_tags($text));
$output=shell_exec("/home/technoworld/Videos/LinSocket/Modular/x " . $temp);
echo $output;
?>

【讨论】:

  • 太棒了!非常感谢!你真可爱,请保留一些漂亮的个人资料图片:)
  • $output=shell_exec("/home/technoworld/Videos/LinSocket/Modular/x " . $temp); 等价于$output=shell_exec("/home/technoworld/Videos/LinSocket/Modular/x '$temp'");?或者哪一个是正确的? `
  • @Karimkhan 我的 PHP 知识有点生疏。但我的猜测是第二个也是允许的,除非你不应该在 $temp 周围使用引号,因为这些是 escapeshellarg 已经添加的。
【解决方案2】:

您可以修改 C++ 和 PHP 源代码并构建管道。

C++

int main () {
    std::ostringstream txt;
    txt << std::cin.rdbuf();
    std::cout << "Input: \n" << txt.str() << std::endl;
    return 0;
}

PHP

<?php
$pipe = popen('Debug/Test', 'w'); 
if( ! $pipe) {
    // Error
} 
else { 
    $txt = 'Hello World'; 
    fwrite($pipe, $txt, strlen($txt)); 
    pclose($pipe);
}
?>

【讨论】:

  • 我喜欢你的建议。可惜它被置若罔闻。 (cin&gt;&gt;txt.rdbuf() 工作了吗?我从未尝试过。另外,我认为反过来更有意义,语义上)
猜你喜欢
  • 2011-10-14
  • 2014-08-05
  • 2018-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-09
  • 1970-01-01
相关资源
最近更新 更多