这是我的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程序提供输入。我做错了什么?
答案 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。
中重新编码密码