C 当参数相等时,While循环不停止

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)

我正在使用./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)  
    {
        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*
s
operator==
在两个
char*
s上,只需检查它们是否指向相同的内存位置。您需要的是比较它们所表示的字符串的内容。因此,
if
s应该如下所示:

if(!strcmp(argv[1], EncryptLine1))

argv[1]
EncryptLine1
EncryptLine2
都是
char*
s
operator==
在两个
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()
    和族。