【问题标题】:C system function concatenate strings? [duplicate]C系统函数连接字符串? [复制]
【发布时间】:2013-06-27 19:13:40
【问题描述】:

我来自java,我无法弄清楚。我正在尝试使用系统函数连接字符串以运行带有参数的命令,这就是我正在做的,但它不起作用:

system("command "+param1+" other stuff "+param3);

【问题讨论】:

  • 为什么投反对票?这是一个完全合理的问题。
  • @JamesMcLaughlin 因为任何合理的初学者级 C 教程都指出,在 C 中连接字符串并不是那么那么容易,而是使用 stdlib 函数完成的。

标签: c


【解决方案1】:

要在 C 中连接字符串,请使用 snprintf

在 C 中,字符串表示为一个字符数组。他们的名字是指向他们的第一个元素的指针。每个操作都应该使用函数来完成。在其他情况下,您只需进行指针算术。因此,在您的示例中,您尝试从系统中可能不存在的地址启动函数。

不要使用strcat!这很危险如果你真的需要简单的函数来调用使用strlcat

更多信息您需要back to basics

【讨论】:

  • strcat 会导致缓冲区溢出,我认为在这种情况下最好使用snprintf
  • 不!不!不是strcatstrcat 分配缓冲区溢出就像太阳分配阳光一样! ...说真的,不要
  • 只要适当调整缓冲区的尺寸,strcat 就可以了。
  • @JamesMcLaughlin:问题在于,如果您必须附加多个字符串,它会很快变得不平凡且容易出错。最好使用像 snprintf 这样的函数来代表您进行数学运算。
  • @JamesMcLaughlin:再一次,当你只需要发生一个字符串时,一切都很好,当你开始有更多的东西时,它会变成strlen 和一个接一个的错误连接(同样,它效率低下,因为每个 strcatstrlen 每次都会遍历所有字符串);如上所述,把这个烂摊子留给snprintf
【解决方案2】:

您可能想使用snprintf 之类的函数构建命令字符串:您可以在字符串中插入各种类型(不仅是字符串),并且可以防止缓冲区溢出(检查它的返回值!)。

char buffer[256];
if(snprintf(buffer, sizeof(buffer), "command %s other stuff %s", param1, param3)>=sizeof(buffer))
{
   /* the buffer isn't big enough */
}
else
    system(buffer);

【讨论】:

  • 好的,只是想知道参数将进入命令的 %s 是什么?
  • 阅读here 了解可能的格式。不知道为什么不把它链接到其他字符串函数
  • @user2484067:是的,这是字符串参数的占位符;如果您想插入整数而不是使用%d,对于浮点类型%f 等,您可以在documentation 中找到所有受支持的字段说明符。
【解决方案3】:

c 中没有运算符重载。您必须创建足够的缓冲区,然后使用库函数strcat

【讨论】:

猜你喜欢
  • 2015-08-08
  • 2018-05-28
  • 2023-03-06
  • 2016-07-14
  • 2013-09-14
  • 2013-10-09
  • 2011-02-20
  • 1970-01-01
  • 2011-11-06
相关资源
最近更新 更多