проблема в функции sprintf - PullRequest
4 голосов
/ 29 августа 2010

Я пишу для взломщика паролей 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 ]

2 голосов
/ 29 августа 2010

Новая строка, найденная функцией fgets (), хранится в 'pword'. Удалите его, а затем напечатайте каждую строку с помощью \ n и посмотрите, работает ли он.

См. Справочную страницу для fgets () .

Попробуйте добавить следующую строку после вызова fgets ().

pword[strlen(pword) - 1] = '\0';
1 голос
/ 29 августа 2010

За каждым вашим мечом через цикл while следует новая строка.Таким образом вывод:

rar e -pfirstpassword [NEWLINE]
     realp.rar

Вы не заканчиваете команду новой строкой.Таким образом, вывод:

[command1][command2][command3]

Комбинируя две проблемы (добавляя фигурные скобки вокруг каждой итерации цикла, вы получаете:

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

Чтобы устранить проблему. Удалите новые строки в конце каждойстрока пароля.


Для расширения: документация fgets для windows доступна здесь: http://msdn.microsoft.com/en-us/library/c37dh6kf(VS.80).aspx

Из документации:

Функция fgets читаетСтрока из аргумента входного потока и сохраняет ее в строке. fgets считывает символы из текущей позиции потока, включая первый символ новой строки, до конца потока или до тех пор, пока число прочитанных символов не станет равным n - 1, в зависимости от того, чтоидет первым. Результат, сохраненный в str, добавляется с нулевым символом. Символ новой строки, если он прочитан, включается в строку.

Поэтому символ новой строки включается как часть строки, записанной вpword. Поскольку вы не удаляете этот символ, в середине команды появляется новая строка, когда вы пишете его с помощью printf.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...