Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 有效字符数组(这是有效字符串吗)_C++_Visual Studio 2008 - Fatal编程技术网

C++ 有效字符数组(这是有效字符串吗)

C++ 有效字符数组(这是有效字符串吗),c++,visual-studio-2008,C++,Visual Studio 2008,我正在使用ReadProcessMemory填充一个字符数组,我想知道确定返回的字符数组是否包含有效字符串的“正确/标准/最佳”方法是什么。我不担心字符串,它可以包含a-zA-Z0-9加上空格和字符,如“/”和其他一些东西,但我真正想知道的是它是否有效,只是没有垃圾 int char_read_length = 255; char data[255]; memset(data, 0, char_read_length); ReadProcessMemory( hProcess, (void *)

我正在使用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);
谢谢。

这里有几件事:

  • 我们不知道你所说的“有效”是什么意思。如果希望字符串只包含这些字符,请编写一个循环,检查每个字符是否为这些字符之一
  • 无需在阵列上调用memset,因为ReadProcessMemory将为您写入该缓冲区
  • 在哪里定义了
    lpRead
    ?如果它确实是一个
    lp
    变量(代表“长指针”),则在将其传递到ReadProcessMemory之前,您应该获取它的地址。如果它不是指针,那么您应该更改它的名称,使其不以LP开头。(实际上,您可能不想使用匈牙利符号,但如果要使用匈牙利符号,至少要正确使用)
  • 如果这是C++,则应该使用 StistalQuase而不是C样式CAST将字符指针转换为空指针。

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

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

    我可能只会使用如下内容(请注意,使用此选项需要确保
    数据
    正确地
    '\0'
    终止):

    如果要检查整个255个字节是否“有效”,则还需要检查strlen(data)=255

    也许有一个很好的C++ STL算法,它也可以处理这个问题,但是我可能还是会使用<代码> STRSPNER()/<代码>,因为某种懒惰的形式。

    注意,您可能需要检查<代码> > RealPrimeMeMyCyMy](.< /P>)的错误返回,我的意思是“它是一个字符串”。我可以通过Boost ReGEX传递它,但我只是想知道是否有一个函数,我在C++库中没有发现,它无论如何都会这样做。有一个名为isalnum()的函数,但它不考虑“./”等字符。该符号直接来自Hoglund,我使用ReadProcessMemory的方式也是如此。@flavour404:即使是一个完整的垃圾字符串也是一个字符串。我不知道“霍格伦”是什么。是的,isalnum没有考虑像这样的事情。和/,等等。但是您可以编写一个函数,它完全满足您的需要。检查角色是否在您希望的范围内。wrt 4,此时不应强制转换all@Ben在C++中需要一个强制转换。如果是C代码,则不需要强制转换。(<代码> RealPosialMythys<代码>采用<代码> Value*/Cuff>)比利:任何指针类型转换为<代码> VUL**/COD>在C和C++中都是隐式的。不需要石膏。不应使用强制转换。如果本例中的“字符串”表示“以null结尾的字符串”,则为真+1.这是保存在字符数组中的字符串类型。“此字符数组是否包含有效字符串?”这一问题对于字符串的其他值没有意义,例如

    std::string
    (需要其他成员,如length)或
    BSTR
    (需要是
    wchar\u t
    的数组,加上长度前缀)。谢谢你,本,这就是我想要的。另一方面,即使不是以null结尾的字符串仍然是字符串。。。即字符串是空的。考虑编辑你的问题来定义什么使字符串“有效”或“垃圾”。这些术语非常主观……谢谢,我正在查看ReadProcessMemory的返回。
    char const validChars[] = "abcdefghijklmnopqrstuvwxyz"
                              "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
                              "0123456789"
                              "./_"
                              " ";  // add whatever other characters are considered valid
    
    
    bool isValidString(char const* s) 
    {
        return strspn(s, validChars) == strlen(s);
    }