我正在编写一个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
任何人都可以帮我解决这个问题吗?提前谢谢。
答案 0 :(得分:2)
fgets()找到的换行符保存在'pword'中。删除它然后用\ n打印每一行,看看它是否有效。
请参阅fgets()的手册页。
尝试在fgets()调用后添加以下行。
pword[strlen(pword) - 1] = '\0';
答案 1 :(得分:1)
每次通过while循环时,你的pword后跟一个新行。 因此输出:
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函数从中读取字符串 输入流参数和存储 它在str。 fgets从中读取字符 当前流的位置和 包括第一个换行符, 到流的末尾,或直到 读取的字符数等于 n - 1,以先到者为准。该 存储在str中的结果附加了 一个空字符。换行 字符,如果读,则包含在 字符串。
因此,Newline字符作为写入pword的字符串的一部分包含在内。由于不删除此字符,因此在使用printf编写时会在命令中间出现换行符。