C 当参数相等时,While循环不停止
我正在使用./crack 50yoN9fp966dU运行此程序C 当参数相等时,While循环不停止,c,C,我正在使用./crack 50yoN9fp966dU运行此程序 50yoN9fp966dU是深红色加密的。在单词表上。我的计划如下: #define _XOPEN_SOURCE #include <unistd.h> #include <stdio.h> #include <string.h> #include <stdlib.h> int main(int argc, char *argv[]) { if(argc > 2)
50yoN9fp966dU是深红色加密的。在单词表上。我的计划如下:
#define _XOPEN_SOURCE
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
if(argc > 2)
{
printf("Invalid Argument \n");
return 1;
}
else
{
FILE *fp1;
fp1 = fopen("/usr/share/dict/words", "r");
char line[9];
while (fgets(line, 9, fp1) != NULL)
{
char *EncryptLine1;
char *EncryptLine2;
printf("%s", line);
EncryptLine1 = crypt(line, "50");
if(argv[1] == EncryptLine1)
{
printf("%s \n", line);
}
EncryptLine2 = crypt(line, "HA");
if(argv[1] == EncryptLine2)
{
printf("%s \n", EncryptLine2);
}
}
}
}
定义源代码
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
如果(argc>2)
{
printf(“无效参数\n”);
返回1;
}
其他的
{
文件*fp1;
fp1=fopen(“/usr/share/dict/words”,“r”);
字符行[9];
while(fgets(第9行,fp1)!=NULL)
{
字符*1;
字符*2;
printf(“%s”,第行);
EncryptLine1=密码(第50行);
如果(argv[1]==EncryptLine1)
{
printf(“%s\n”,第行);
}
EncryptLine2=密码(第行,“HA”);
如果(argv[1]==EncryptLine2)
{
printf(“%s\n”,EncryptLine2);
}
}
}
}
如果我添加一个
printf(“%s”,EncryptLine1)
,我会看到argv[1]
,即50yoN9fp966dU,但循环继续,不会打印答案 argv[1]
,EncryptLine1
和EncryptLine2
都是char*
soperator==
在两个char*
s上,只需检查它们是否指向相同的内存位置。您需要的是比较它们所表示的字符串的内容。因此,if
s应该如下所示:
if(!strcmp(argv[1], EncryptLine1))
argv[1]
,EncryptLine1
和EncryptLine2
都是char*
soperator==
在两个char*
s上,只需检查它们是否指向相同的内存位置。您需要的是比较它们所表示的字符串的内容。因此,if
s应该如下所示:
if(!strcmp(argv[1], EncryptLine1))
您正在进行指针比较,而不是内容(指针数据)比较。 更改此项:
if (argv[1] == EncryptLine1)
为此:
if (strcmp(argv[1],EncryptLine1) == 0)
if (strcmp(argv[1],EncryptLine2) == 0)
这是:
if (argv[1] == EncryptLine2)
为此:
if (strcmp(argv[1],EncryptLine1) == 0)
if (strcmp(argv[1],EncryptLine2) == 0)
您正在进行指针比较,而不是内容(指针数据)比较。 更改此项:
if (argv[1] == EncryptLine1)
为此:
if (strcmp(argv[1],EncryptLine1) == 0)
if (strcmp(argv[1],EncryptLine2) == 0)
这是:
if (argv[1] == EncryptLine2)
为此:
if (strcmp(argv[1],EncryptLine1) == 0)
if (strcmp(argv[1],EncryptLine2) == 0)
您的代码中有一些问题:
argc
永远不会小于2。在第一种情况下,检查不相等的2而不是较大的2。无论如何,如果您从if块返回,那么使用else和进行更深的嵌套实际上是多余的
break
来中断循环,或者添加一个return
来在打印成功后将函数保留在条件块中
if( ! strcmp(argv[1], EncryptLine1)) {
printf("%s \n", line);
break;
}
顺便说一句:为什么不重新使用
EncryptLine1
(根本不需要任何临时代码)?您的代码中有一些问题:
argc
永远不会小于2。在第一种情况下,检查不相等的2而不是较大的2。无论如何,如果您从if块返回,那么使用else和进行更深的嵌套实际上是多余的
break
来中断循环,或者添加一个return
来在打印成功后将函数保留在条件块中
if( ! strcmp(argv[1], EncryptLine1)) {
printf("%s \n", line);
break;
}
顺便说一句:为什么不重新使用
EncryptLine1
(根本不需要任何临时设置)?尝试使用strcmp来比较字符串。我相信使用双等式符号在c语言中对字符串不起作用。你是在比较内存位置(地址)。要比较字符串,请使用strcmp()和族。请尝试使用strcmp比较字符串。我相信使用双等式符号在c语言中对字符串不起作用。你是在比较内存位置(地址)。要比较字符串,请使用strcmp()
和族。