使用strstr()函数正在破坏

时间:2013-05-25 11:28:44

标签: c++ c

我正在使用strstr()功能,但我遇到了崩溃。

此部分代码崩溃,错误为“访问冲突读取位置0x0000006c。”  strstr(p_czCharactersToDelete, (const char*)p_czInputString[index]))

这是完整的代码......

#include "stdafx.h"    
#include <iostream>
#include <string>
void delchar(char* p_czInputString, const char* p_czCharactersToDelete)
{
    for (size_t index = 0; index < strlen(p_czInputString); ++index)
    {
        if(NULL != strstr(p_czCharactersToDelete, (const char*)p_czInputString[index]))
        {
            printf_s("%c",p_czInputString[index]);

        }
    }
}
int main(int argc, char* argv[])
{
    char c[32];
    strncpy_s(c, "life of pie", 32); 
    delchar(c, "def");

    // will output 'li o pi'
    std::cout << c << std::endl;
}

2 个答案:

答案 0 :(得分:2)

strstr()的原型如下,

char * strstr ( char * str1, const char * str2 );

该函数用于定位主字符串中的子字符串。它返回指向str2中第一次出现str1的指针,如果str2不属于str1,则返回空指针。

在您的情况下,您将错误的参数传递给strstr()。你在打电话, strstr(p_czCharactersToDelete, (const char*)p_czInputString[index]));,这是错误的。因为指针p_czCharactersToDelete指向子字符串常量而p_czInputString指向主字符串。将strstr()称为strstr(p_czInputString, p_czCharactersToDelete);,并在功能delchar()中进行相应的更改。

答案 1 :(得分:1)

你正在使用错误的strstr。  您可能需要strchrstrpbrk

#include <cstring>
#include <algorithm>

class Include {
public:
    Include(const char *list){ m_list = list; }

    bool operator()(char ch) const
    {
        return ( strchr(m_list, ch) != NULL );
    }

private:
    const char *m_list;
};

void delchar(char* p_czInputString, const char* p_czCharactersToDelete){
    Include inc(p_czCharactersToDelete);
    char *last = std::remove_if(p_czInputString, p_czInputString + strlen(p_czInputString), inc);
    *last = '\0';
}