有效的char数组(这是一个有效的字符串)

时间:2010-11-19 23:11:02

标签: c++ visual-studio-2008

我正在使用ReadProcessMemory填充char数组,我很想知道确定返回的char数组是否包含有效字符串的'正确/标准/最佳'方法是什么。我并不担心字符串,它可以包含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 个答案:

答案 0 :(得分:1)

如果它包含终止字符串的NUL字符,则可以将其视为字符串。如果没有NUL,将其视为字符串将在缓冲区的末尾运行并导致非常糟糕的事情发生。因此:

bool is_it_a_string = memchr(data, 0, char_read_length);

答案 1 :(得分:0)

这里有几件事:

  1. 我们不知道“有效”是什么意思。如果你想要一个只包含那些字符的字符串,你自己写一个循环来检查每个字符是否是这些字符之一。
  2. 无需在数组上调用memset,因为无论如何ReadProcessMemory都会为你写入缓冲区。
  3. lpRead在哪里定义?如果它确实是lp变量(代表“长指针”),那么在将它传递给ReadProcessMemory之前,你应该获取它的地址。如果它不是指针,那么你应该改变它的名字,这样它就不会以LP开头。 (实际上,你可能不想使用匈牙利表示法,但如果你打算使用它至少要正确使用它)
  4. 如果这是C ++,您应该使用static_cast而不是C样式转换来将字符指针强制转换为void指针。

答案 2 :(得分:0)

我可能只是使用类似下面的内容(请注意,使用此功能需要确保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()的错误回复。