好吧,这听起来可能很愚蠢,但我想不出一种将 int/char 传递给这个系统调用的方法
这就是我希望它的工作方式
system ("cal %d %d", month, year);
cal 3 2009
我希望这会在终端“ ”上给我以下命令
终端会显示 2009 年 3 月的日历。
但是编译器抱怨它有太多参数
有任何想法吗?我需要让这个方法system ("cal ")
返回一个动态日历。
备注:cal
拿论据cal month year
好吧,这听起来可能很愚蠢,但我想不出一种将 int/char 传递给这个系统调用的方法
这就是我希望它的工作方式
system ("cal %d %d", month, year);
cal 3 2009
我希望这会在终端“ ”上给我以下命令
终端会显示 2009 年 3 月的日历。
但是编译器抱怨它有太多参数
有任何想法吗?我需要让这个方法system ("cal ")
返回一个动态日历。
备注:cal
拿论据cal month year
您需要构建正确的命令行字符串,system()
不会为您做:
char cmd[64];
snprintf(cmd, sizeof cmd, "cal %d %d", month, year);
system(cmd);
关于缓冲区溢出的常见警告适用,尽管在这种特殊情况下,当两个参数都是整数时,您应该是相当安全的。
基本上,只需在系统调用之外执行您的 printf 操作:
char my_cmd[MAX_SIZE];
snprintf(my_cmd, MAX_SIZE, "cal %d %d", month, year);
system(my_cmd);
您需要传递一个已经进行了所有必要转换的字符串。您可以使用 sprintf() 来生成这样的字符串,只是要小心分配足够大的缓冲区。
发生这种情况是因为您假设系统的行为类似于 printf,但事实并非如此。要获得所需的内容,您必须首先通过 sprintf 将替换获取到缓冲区中,然后将此缓冲区传递给系统。
不过要小心,这可能会成为一个潜在的安全漏洞,因为您可能会允许在命令行执行时传递未知参数。此外,您必须注意您使用的临时缓冲区足够大以容纳您的最终字符串。
尝试
#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);
}
您必须在使用它调用系统之前将命令格式化为字符串,例如使用 snprintf
char
string[64];
sprintf( string, "cal %d %d", month, year );
system( string );