虽然循环在参数相等时不停止

时间:2014-08-02 18:29:42

标签: c

我正在使用 ./ crack 50yoN9fp966dU执行此程序 50yoN9fp966dU 是crimson加密的。这是在单词列表上。我的计划如下:

#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);
            }
        }  
    }
}

如果我添加printf("%s", EncryptLine1),我会看到argv[1],即 50yoN9fp966dU ,但循环继续并且不会打印答案。

3 个答案:

答案 0 :(得分:2)

您正在进行指针比较,而不是内容(指向数据)比较。

改变这个:

if (argv[1] == EncryptLine1)

对此:

if (strcmp(argv[1],EncryptLine1) == 0)

而且:

if (argv[1] == EncryptLine2)

对此:

if (strcmp(argv[1],EncryptLine2) == 0)

答案 1 :(得分:1)

argv[1]EncryptLine1EncryptLine2都是char*。两个operator==上的char*只是检查它们是否指向相同的内存位置。你想要的是比较它们代表的字符串的内容。所以,if应该是这样的:

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

答案 2 :(得分:1)

您的代码中存在一些问题:

  1. 你乐观地认为argc永远不会小于2.在第一个条件下检查不等于2而不是更大的两个。
    无论如何,如果你退出if-block,使用else并进行更深层次的嵌套实际上是多余的。
  2. Strings cannot be compared with ==, use strcmp.

    if( ! strcmp(argv[1], EncryptLine1))
    
  3. 如果要在那里结束循环,则需要添加break以突破循环或添加return以在打印成功后将函数保留在条件块中。

    if( ! strcmp(argv[1], EncryptLine1)) {
        printf("%s \n", line);
        break;
    }
    
  4. 顺便说一句:为什么不重复使用EncryptLine1(并不是说你需要任何暂时性的)?