sprintf函数中的问题

时间:2010-08-29 13:17:31

标签: c file

我正在编写一个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
  • 编译器:dev c ++

2 个答案:

答案 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编写时会在命令中间出现换行符。