Как Вы изменяете расширение файла, сохраненное в строке в C++?

Я думаю, что вы хотите использовать разные регулярные выражения для разных надежных паролей. Большинство движков регулярных выражений имеют функцию под названием «lookarounds». Это в основном утверждения. Я приведу вам пример, использующий косвенные утверждения.

var isEightCharactersLong = '(?=.{8,})';
var hasNumbers = '(?=.*[0-9])';
var hasLowerCase = '(?=.*[a-z])';
var hasUpperCase = '(?=.*[A-Z])';
// we're escaping the regex reserved characters using '\'
var hasSpecialCharacters = '(?=.*[!@#\$%\^&])'; 

Затем вы можете использовать их для создания более сложных регулярных выражений, комбинируя их:

// For ES6 with template strings
// 8 characters long AND has numbers AND (has lowercase OR has uppercase)
const weakPasswordRegex = new RegExp(
  `^${isEightCharactersLong}${hasNumbers}(${hasLowerCase}|${hasUpperCase})

Я думаю, что вы хотите использовать разные регулярные выражения для разных надежных паролей. Большинство движков регулярных выражений имеют функцию под названием «lookarounds». Это в основном утверждения. Я приведу вам пример, использующий косвенные утверждения.

[110]

Затем вы можете использовать их для создания более сложных регулярных выражений, комбинируя их:

); // For lower ES versions var weakPasswordRegex = new RegExp( '^' + isEightCharactersLong + hasNumbers + '(' + hasLowerCase + '|' + hasUpperCase + ')

Вы также можете извлечь измерение надежности пароля в отдельную функцию:

function measurePasswordStrength(password) {
  var weakPassword = new RegExp('<placeholder>');
  var mediumPassword = new RegExp('<placeholder>');
  var strongPassword = new RegExp('<placeholder>');
  if (strongPassword.test(password)) return 3;
  if (mediumPassword.test(password)) return 2;
  if (weakPassword.test(password)) return 1;
  return 0;
}
[ 117] Тогда ваш PasswordMeter станет намного более читабельным и понятным:

function PasswordMeter(password) {
  if (password.length === 0) {
    document.getElementById("msg").innerHTML = "";
    return;
  }

  var color = "";
  var strength = "";
  switch (measurePasswordStrength(password)) {
    case 0:
    case 1:
      strength = "Weak: Keep going...";
      color = "red";
      break;
    case 2:
      strength = "Medium: A little better but add more..";
      color = "blue";
      break;
    case 3:
      strength = "Strong! Now that is good!";
      color = "green"; 
      break;
  }

  document.getElementById("msg").innerHTML = strength;
  document.getElementById("msg").style.color = color;
}

Вы также можете извлечь измерение надежности пароля в отдельную функцию:

function measurePasswordStrength(password) {
  var weakPassword = new RegExp('<placeholder>');
  var mediumPassword = new RegExp('<placeholder>');
  var strongPassword = new RegExp('<placeholder>');
  if (strongPassword.test(password)) return 3;
  if (mediumPassword.test(password)) return 2;
  if (weakPassword.test(password)) return 1;
  return 0;
}
[ 117] Тогда ваш PasswordMeter станет намного более читабельным и понятным:

function PasswordMeter(password) {
  if (password.length === 0) {
    document.getElementById("msg").innerHTML = "";
    return;
  }

  var color = "";
  var strength = "";
  switch (measurePasswordStrength(password)) {
    case 0:
    case 1:
      strength = "Weak: Keep going...";
      color = "red";
      break;
    case 2:
      strength = "Medium: A little better but add more..";
      color = "blue";
      break;
    case 3:
      strength = "Strong! Now that is good!";
      color = "green"; 
      break;
  }

  document.getElementById("msg").innerHTML = strength;
  document.getElementById("msg").style.color = color;
}
10
задан Bill the Lizard 1 October 2012 в 13:30
поделиться

8 ответов

Есть несколько подходов к этому.

Вы можете взять супер ленивый подход, и пусть они вводят только имя файла, а не расширение .txt. В этом случае вы можете добавить .txt к нему, чтобы открыть входной файл.

infile.open(filename + ".txt");

Затем вы просто вызываете

outfile.open(filename + ".code");

. Следующий подход - взять полное имя файла, включая расширение, и просто добавить .code к нему, чтобы вы могли иметь test.txt.code.

Это немного неоднозначно, если это приемлемо или нет.

Наконец, вы можете использовать методы std :: string find ,

9
ответ дан 3 December 2019 в 14:18
поделиться

Конечно, если бы это была не домашняя работа, а реальный проект, вы бы, вероятно, сделали это сами - как также как и другие люди, читающие ваш код - польза от использования replace_extension () Boost.Filesystem вместо 114 ваших собственных. Просто нет такой функциональности, которая была бы достаточно простой, чтобы вы не могли выдать ошибку, по крайней мере, в каком-то угловом случае.

9
ответ дан 3 December 2019 в 14:18
поделиться

Не отдавать его, так как обучение - это весь смысл упражнения, но вот подсказка. Вы, вероятно, захотите комбинацию find_last_of и заменить .

4
ответ дан 3 December 2019 в 14:18
поделиться

Вот несколько подсказок. У вас уже есть введенное имя файла - вам нужно получить часть имени файла, которая не содержит расширения:

std::string basename(const std::string &filename)
{
  // fill this bit in
}

Написав эту функцию, вы можете использовать ее для создания имени нового файла:

std::string codeFile = basename(filename) + ".code";
outFile.open(codeFile);
3
ответ дан 3 December 2019 в 14:18
поделиться

Псевдокод будет делать что-то вроде

outFilename = filename;
<change outFilename>
outfile.open(outFilename);

Для изменения outFilename посмотрите на strrchr и strcpy в качестве отправной точки (может быть, более подходящие методы - это будет прекрасно работать с символом *)

0
ответ дан 3 December 2019 в 14:18
поделиться

В Windows (по крайней мере) вы можете использовать _splitpath , чтобы отделить базовое имя от остальных частей, а затем снова собрать их, используя ваш любимый форматировщик строк.

0
ответ дан 3 December 2019 в 14:18
поделиться

почему бы не использовать строковый метод find_last_of () ?

std::string new_filename = filename;
size_type result = new_filename.find_last_of('.');

// Does new_filename.erase(std::string::npos) working here in place of this following test?
if (std::string::npos != result)
    new_filename.erase(result);

// append extension:
filename.append(".code");
0
ответ дан 3 December 2019 в 14:18
поделиться

Что вам нужно сделать, это скопировать оригинальное имя файла в новую переменную, где вы можете изменить расширение. Примерно так:

string outFilename;
size_t extPos = filename.rfind('.');
if (extPos != string::npos)
{
    // Copy everything up to (but not including) the '.'
    outFilename.assign(filename, 0, extPos);
    // Add the new extension.
    outFilename.append(".code");
    // outFilename now has the filename with the .code extension.
}

Возможно, вы могли бы использовать переменную «filename», если вам не нужно сохранять исходное имя файла для дальнейшего использования. В этом случае вы можете просто использовать:

size_t extPos = filename.rfind('.');
if (extPos != string::npos)
{
    // Erase the current extension.
    filename.erase(extPos);
    // Add the new extension.
    filename.append(".code");
}

Ключ в том, чтобы посмотреть определение строкового класса C ++ и понять, что делает каждая функция-член. Использование rfind будет выполнять поиск в обратном направлении через строку, и вы не будете случайно попадать в какие-либо расширения в именах папок, которые могут быть частью исходного имени файла (например, «C: \ MyStuff.School \ MyFile.txt»). При работе со смещениями от find, rfind и т. Д. Вы также должны быть осторожны, чтобы правильно использовать их при передаче их в качестве значений другим методам (например,

-1
ответ дан 3 December 2019 в 14:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: