【问题标题】:problem in sprintf functionsprintf 函数中的问题
【发布时间】:2010-08-29 13:17:30
【问题描述】:

我正在编写一个 rar 密码破解程序。我正在从文件中读取密码并将其传递给 sprintf 函数。这是代码。

FILE* fp = fopen("password.txt","r");
    while ( fgets ( pword, sizeof(pword), fp ) != NULL )
    {
          sprintf(command, "rar e -p%s realp.rar", pword);
          printf(command);
          //system(command);                                               
    }

这段代码看起来不错,但它不起作用。因此我评论了系统功能并打印了变量“命令”。输出是这样的:

rar e -pfirstpassword
     realp.rarrar e -psecondpassword
     realp.rarrar e -pthirdpassword
     realp.rarrar e -pfourthpassword realp.rar

我可以看到它坏了。输出应该是这样的。

rar e -pfirstpassword realp.rar
rar e -psecondpassword realp.rar
rar e -pthirdpassword realp.rar
rar e -pfourthpassword realp.rar

谁能帮我解决这个问题?提前致谢。

  • 操作系统:Windows 7
  • 编译器:开发 c++

【问题讨论】:

  • Not working 不是一个非常精确的问题描述。
  • 我格式化了输出。很抱歉给您带来不便。
  • 这仍然没有回答我的问题。使用system 命令时什么不起作用?您是否收到错误消息,您的程序/计算机是否崩溃,苹果是否开始从天上掉下来,...?
  • 文件内容是什么?
  • 我想,我没有正确解释问题。此代码应该提取 rar 文件,但它没有提取。相反,它打开了 rar 命令的所有选项。

标签: c file


【解决方案1】:

fgets() 找到的换行符保存在“pword”中。删除它,然后用 \n 打印每一行,看看它是否有效。

参见fgets() 的手册页。

尝试在 fgets() 调用之后添加以下行。

pword[strlen(pword) - 1] = '\0';

【讨论】:

  • 感谢您的帮助,但我无法理解。能否请您详细说明。
【解决方案2】:

您的 pword 每次通过 while 循环时都会跟着一个新行。 因此输出:

rar e -pfirstpassword [NEWLINE]
     realp.rar

您不要以新行结束命令。 因此输出:

[command1][command2][command3]

结合这两个问题(在你得到的每个循环迭代周围添加大括号:

{rar e -pfirstPassword [NEWLINE]
         realp.rar}{rar e -psecondPassword [NEWLINE]
         realp.rar}

解决问题。删除每个密码行末尾的新行。


展开: Windows 的 fgets 文档可在此处获得: http://msdn.microsoft.com/en-us/library/c37dh6kf(VS.80).aspx

来自文档:

fgets 函数从 输入流参数和存储 它在海峡。 fgets 从 当前流位置到和 包括第一个换行符, 到流的末尾,或直到 读取的字符数等于 n – 1,以先到者为准。这 存储在 str 中的结果附加 一个空字符。换行符 字符,如果读取,包含在 字符串。

因此,换行符作为写入 pword 的字符串的一部分包含在内。由于您不删除此字符,因此当您使用 printf 编写命令时,命令中间会有一个换行符。

【讨论】:

  • 表示我必须修改包含密码的文件?我不能这样做,因为我编写的用于生成单词的所有可能组合的代码会在新行中打印所有字符串。我可以改变它,但我认为这不是一个好主意。我可以更改此代码并解决问题吗??
  • 是的,如上面的答案所示,您所要做的就是从字符串中删除换行符。显示的代码片段。 -- pword[strlen(pword) - 1] = '\0'; -- 将以一种简单的方式做到这一点。
猜你喜欢
  • 1970-01-01
  • 2014-02-09
  • 1970-01-01
  • 2015-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多