4

好吧,这听起来可能很愚蠢,但我想不出一种将 int/char 传递给这个系统调用的方法

这就是我希望它的工作方式

system ("cal %d %d", month, year);

cal 3 2009我希望这会在终端“ ”上给我以下命令

终端会显示 2009 年 3 月的日历。

但是编译器抱怨它有太多参数

有任何想法吗?我需要让这个方法system ("cal ")返回一个动态日历。

备注:cal拿论据cal month year

4

7 回答 7

8

您需要构建正确的命令行字符串,system()不会为您做:

char cmd[64];

snprintf(cmd, sizeof cmd, "cal %d %d", month, year);
system(cmd);

关于缓冲区溢出的常见警告适用,尽管在这种特殊情况下,当两个参数都是整数时,您应该是相当安全的。

于 2009-03-31T08:28:41.130 回答
3

基本上,只需在系统调用之外执行您的 printf 操作:

char my_cmd[MAX_SIZE];
snprintf(my_cmd, MAX_SIZE, "cal %d %d", month, year);
system(my_cmd);
于 2009-03-31T08:29:32.050 回答
1

您需要传递一个已经进行了所有必要转换的字符串。您可以使用 sprintf() 来生成这样的字符串,只是要小心分配足够大的缓冲区。

于 2009-03-31T08:25:28.160 回答
1

发生这种情况是因为您假设系统的行为类似于 printf,但事实并非如此。要获得所需的内容,您必须首先通过 sprintf 将替换获取到缓冲区中,然后将此缓冲区传递给系统。

不过要小心,这可能会成为一个潜在的安全漏洞,因为您可能会允许在命令行执行时传递未知参数。此外,您必须注意您使用的临时缓冲区足够大以容纳您的最终字符串。

于 2009-03-31T08:26:44.957 回答
1

尝试

#include <stdlib.h>
#include <stdio.h>

int main()
{
  char command_buf [20];
  const int month = 3;
  const int year = 2009;
  snprintf(command_buf, sizeof(command_buf), "cal %d %d", month, year);
  system(command_buf);
}
于 2009-03-31T08:31:46.770 回答
0

您必须在使用它调用系统之前将命令格式化为字符串,例如使用 snprintf

于 2009-03-31T08:26:43.337 回答
0
char
  string[64];

sprintf( string, "cal %d %d", month, year );

system( string );
于 2009-03-31T08:28:17.153 回答