Проверка пути в cpp: невозможно удалить специальные символы с кодом ASCII

Если вы спрашиваете, можете ли вы безопасно выгружать / деактивировать DLL, загруженную в процессе из кода самой DLL, ответ - нет - на самом деле нет надежного способа сделать это.

Подумайте об этом так: разгрузка DLL выполняется путем уменьшения его количества ссылок, используя FreeLibrary (). Проблема, конечно, в том, что после того, как счетчик ссылок DLL достигнет нуля, модуль не будет отображен. Это означает, что код в DLL, который вызвал FreeLibrary (), исчез.

Даже если вы можете это сделать, вам все равно нужно убедиться, что нет других потоков, выполняющих экспортированные функции из DLL.

-1
задан Ramesh Aravind M 5 March 2019 в 07:35
поделиться

1 ответ

, вероятно, вы хотите:

for(i=0,j=0; temp[i] != 0 ;i++) {
  if (((temp[i] >= 0x2F) && (temp[i] <= 0X39)) || 
      ((temp[i] >= 0x40) && (temp[i] <= 0x5A)) || 
      ((temp[i] >= 0x61) && (temp[i] <= 0x7A))) {
    printf("\n%c valid\n\n",temp[i]);
    msg[j++] = temp[i];
  }
}
msg[j] = '\0';

, иначе для останавливается на первом символе, несовместимом с тестом, и потому что ваш ввод начинается с пробела для [ 1110] немедленно останавливается.

Дополнительное замечание: не используйте код ascii, используйте char напрямую (например, '.'), И у вас также есть функции, такие как isspace и т. Д., Которые не связаны с данным кодом.

Поэтому, если вы все еще хотите использовать тот же тест, сделайте:

  if (((temp[i] >= '/') && (temp[i] <= '9')) || 
      ((temp[i] >= '@') && (temp[i] <= 'Z')) || 
      ((temp[i] >= 'a') && (temp[i] <= 'z'))) {

, поскольку вы можете видеть, что это более читабельно, но это все еще делает предположения относительно порядка кодирования символов, потому что вы предполагаете: 0 'следует сразу после' / 'и т. Д.

Если ваша цель - получить только алфавитно-цифровые символы больше /, а @ сделайте это:

  if (isalnum(temp[i]) || (temp[i] == '/') || (temp[i] == '@')) {

Пример:

#include <stdio.h>
#include <ctype.h>
#include <string.h>

char * filter(const char * temp)
{
  char * msg = new char[strlen(temp)];
  size_t i, j;

  for (i=0,j=0; temp[i] != 0 ;i++) {
    if (isalnum(temp[i]) || (temp[i] == '/') || (temp[i] == '@')) {
      printf("\n%c valid\n\n",temp[i]);
      msg[j++] = temp[i];
    }
  }
  msg[j] = '\0';

  return msg;
}

int main()
{
  char * s = filter(" \n \n ,,,,/storage/ sdcard0/ ... fusionlogs");

  puts(s);
  delete [] s;
}

Компиляция и выполнение:

pi@raspberrypi:/tmp $ g++ -pedantic -Wextra p.c
pi@raspberrypi:/tmp $ ./a.out

/ valid


s valid


t valid


o valid


r valid


a valid


g valid


e valid


/ valid


s valid


d valid


c valid


a valid


r valid


d valid


0 valid


/ valid


f valid


u valid


s valid


i valid


o valid


n valid


l valid


o valid


g valid


s valid

/storage/sdcard0/fusionlogs

Но мы на C ++, поэтому другой возможностью является использование std::string, я не использовал выше, потому что ваш msg[j] = '\0'; ясно указывает на то, что вы используете C массив.

Пример:

#include <ctype.h>
#include <string>
#include <iostream>

std::string filter(const std::string & temp)
{
  std::string msg;

  for (auto c : temp) {
    if (isalnum(c) || (c == '/') || (c == '@')) {
      std::cout << c << " valid" << std::endl; // it is useless to produce 3 newlines
      msg.push_back(c);
    }
  }

  return msg;
}

int main()
{
  std::string s = filter(" \n \n ,,,,/storage/ sdcard0/ ... fusionlogs");

  std::cout << s << std::endl;
}

Компиляция и выполнение:

pi@raspberrypi:/tmp $ g++ -pedantic -Wextra p.c
pi@raspberrypi:/tmp $ ./a.out
/ valid
s valid
t valid
o valid
r valid
a valid
g valid
e valid
/ valid
s valid
d valid
c valid
a valid
r valid
d valid
0 valid
/ valid
f valid
u valid
s valid
i valid
o valid
n valid
l valid
o valid
g valid
s valid
/storage/sdcard0/fusionlogs

Обратите внимание, что также возможно изменить копию исходной строки (поэтому не используйте константную ссылку об этом) удаление нежелательных символов, а не создавать другую строку

0
ответ дан bruno 5 March 2019 в 07:35
поделиться
Другие вопросы по тегам:

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