C命令行密码
因此,我尝试创建一个C程序,您必须在命令行中输入密码,如 /登录密码1 如果密码是password1,它会说些什么。如果没有,它将打印另一条消息。这是我现在拥有的代码:C命令行密码,c,command-line-interface,C,Command Line Interface,因此,我尝试创建一个C程序,您必须在命令行中输入密码,如 /登录密码1 如果密码是password1,它会说些什么。如果没有,它将打印另一条消息。这是我现在拥有的代码: #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { if (argc < 2) { printf("usage: %s <password>\n", argv[0]); }
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
if (argc < 2) {
printf("usage: %s <password>\n", argv[0]);
}
char pass = "password";
if (argc == pass) {
printf("Right\n");
} else {
printf("Wrong\n");
}
}
#包括
#包括
int main(int argc,char*argv[])
{
如果(argc<2){
printf(“用法:%s\n”,argv[0]);
}
char pass=“password”;
如果(argc==通过){
printf(“右”);
}否则{
printf(“错误的\n”);
}
}
但是它不起作用。您正在将命令行参数的计数
argc
与“password”
字符串指针进行比较
首先,您需要使用argv[1]
而不是argc
。您还需要使用合适的strcmp函数,而不仅仅是比较指针
最后,出于安全考虑,通过命令行输入密码通常不是一个好主意。在许多系统上,命令行可能对其他用户可见(例如通过“ps”命令)
您正在尝试将字符串分配给字符
。那不行!相反,您需要将pass
声明为char[]
,如下所示:
char pass[] = "password";
下一个问题:
if(argc == pass)
argc
是传递给程序的命令行参数数(包括第一个程序名)。您需要的是argv
,它包含实际参数。具体来说,您可能需要argv[1]
您不能只去argv[1]==pass
,因为这会比较两个字符串的位置。要比较字符串,需要使用strcmp()
。此函数比较两个字符串,如果它们相等,则返回0(这是有充分理由的,但暂时不使用)。前者就像比较两所房子,检查它们是否有完全相同的街道地址;后者就像是一块砖一块砖地比较房子。(摘自@caf)
因此,这条线变成:
if (strcmp(argv[1], pass) == 0)
把这些修复放在一起,它应该会起作用。请同时改进代码的缩进。几周后,不仅对其他人,而且对你自己来说,这将使阅读变得更加容易。学习如何报告问题永远不为时尚早。它究竟是如何不起作用的?你看到的症状是什么?这与你问的问题无关,但是在某些系统(Linux)上,命令行对于其他进程是可见的(在<代码> /PRO//CMDLINE < /代码>)中,所以你不应该考虑命令行参数的秘密。此信息可能在其他几个系统上可用(不确定)。(我认为这很愚蠢)这不是出于安全原因,现在我知道这是一个安全问题,如果这样做的话指针比较不会太复杂:
argc[1]==pass
正在比较两个字符串的位置strcmp()
比较它们的内容。前者就像比较两所房子,检查它们是否有完全相同的街道地址;后者就像是一块砖一块砖地比较房子。@caf+1很好的解释!我希望你不要把这句话加到我的答案上。如果是,请随意回滚。@caf:No,argc[1]不是字符串的位置。argc是一个INT。argc[1]没有任何有意义的值。argv[1]是字符串@阿贝伦基:很明显,这是一个打字错误(所以已经颁布法令,现在修复它为时已晚)。
if (strcmp(argv[1], pass) == 0)