如何从c程序读取perl程序的输入

时间:2014-01-31 22:45:30

标签: c perl

这是我的perl程序

print "Enter your username \n";
$user;
chomp($user);
if ($user =~ /[^a-zA-Z0-9]+/) {
    print "Not Matched";  
} else {
    print "Matched";
}
print "Enter your password \n";
$pwd;
chomp($pwd);
if ($pwd =~ /[^a-zA-Z0-9@#$%^&*]+/) {
    print "Not Matched";  
} else {
    print "Matched";
}

这是我的C程序

int main()
{
char user[20],pwd[20], command[500];
printf("Enter username: ");
scanf("%s",user);
printf("Enter password: ");
scanf("%s",pwd); 


strcpy(command, "/Users/nitinsaxena/Desktop/2.pl");
sprintf("command %s %s", user, pwd);
system(command);

return 0;
}

现在,当我运行我的C程序时,它会询问用户名和密码,但之后显示总线错误:10。我想做的就是从C程序中为我的perl程序提供输入。我做错了什么?

1 个答案:

答案 0 :(得分:2)

我希望你这样做是为了某种学习练习而不是认真尝试验证密码......

您对sprintf的调用不正确。 sprintf需要第一个参数作为输出字符串的指针。

此外,您的代码不检查任何缓冲区溢出,因此如果有人输入输入> 19个字符会崩溃。为了避免这种情况,将%19s放在scanf格式说明符中。

此外,您应该引用perl脚本的参数,否则输入中的空格可能会导致崩溃或更糟。为了安全起见,您必须先检查任何报价字符的输入,然后再将其发送到系统。

无论如何修复sprintf调用替换此

strcpy(command, "/Users/nitinsaxena/Desktop/2.pl");
sprintf("command %s %s", user, pwd);

有了这个

snprintf(command, 500, "/Users/nitinsaxena/Desktop/2.pl '%s' '%s'", user, pwd);

您的perl脚本看起来也不正确。把

$user;

在一条线上本身不会做任何事情。如果用户和密码应该来自命令行参数,那么你应该使用

$user=shift @ARGV;

为什么在C和Perl程序中都会打印提示?

总而言之,您最好在c。

中重新编码密码