допустимый массив символов (это допустимая строка) - PullRequest
0 голосов
/ 20 ноября 2010

Я заполняю массив символов с помощью ReadProcessMemory, и мне любопытно узнать, каков «правильный / стандартный / лучший» способ определить, содержит ли возвращаемый массив символов правильную строку. Я не волнуюсь о строке, она может содержать пробелы a-zA-Z0-9 плюс и символы, такие как './_' и некоторые другие вещи, но на самом деле все, что я хочу знать, если она действительна и просто нет полный барахла.

int char_read_length = 255;
char data[255];
memset(data, 0, char_read_length);
ReadProcessMemory( hProcess, (void *)start, data, char_read_length, &lpRead);

Спасибо.

Ответы [ 3 ]

1 голос
/ 20 ноября 2010

Его можно рассматривать как строку, если она содержит символ NUL для завершения строки. Если NUL отсутствует, обработка его как строки приведет к концу буфера и вызовет очень плохие вещи. Таким образом:

bool is_it_a_string = memchr(data, 0, char_read_length);
0 голосов
/ 20 ноября 2010

Я бы, вероятно, просто использовал что-то вроде следующего (обратите внимание, что для его использования потребуется убедиться, что data правильно '\0' завершен):

char const validChars[] = "abcdefghijklmnopqrstuvwxyz"
                          "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
                          "0123456789"
                          "./_"
                          " ";  // add whatever other characters are considered valid


bool isValidString(char const* s) 
{
    return strspn(s, validChars) == strlen(s);
}

Если вы хотите проверить, что весь255 байт 'допустимо', тогда вам также нужно проверить, что strlen(data) == 255.

Вероятно, есть хороший алгоритм C ++ STL, который может справиться с этим точно так же, но я бы, вероятно, все еще использовалstrspn() из-за определенной формы лени.

Обратите внимание, что вам, вероятно, нужно проверить на ошибку, возвращаемую из ReadProcessMemory().

0 голосов
/ 20 ноября 2010

Пара вещей здесь:

  1. Мы не знаем, что вы подразумеваете под "действительным".Если вам нужна строка, содержащая только эти символы, напишите себе цикл, который проверяет каждый символ, чтобы определить, является ли он одним из этих символов.
  2. Нет необходимости вызывать memset в вашем массиве, потому что ReadProcessMemory собираетсяВ любом случае, пишите в этот буфер для вас.
  3. Где определено lpRead?Если это действительно переменная lp (что означает "длинный указатель"), вам следует не принимать ее адрес перед передачей его в ReadProcessMemory.Если это не указатель, вы должны изменить его имя, чтобы оно не начиналось с LP.(На самом деле, вы все равно можете не использовать венгерскую нотацию, но если вы собираетесь ее использовать, по крайней мере, сделайте это правильно)
  4. Если это C ++, вы должны использовать static_cast, а не стиль Cприведение для приведения указателя символа к пустому указателю.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...