我从这段代码中得到一个无效的空指针错误。我猜它与字符串有关,但正如我最近才知道的那样,我找不到问题。
string batchCipherFiles()
{
int count(0);
string text, file;
ifstream inputFile;
cout << " How many files do you wish to encrypt?: ";
cin >> count;
for (int i(1) ; i <= count ; ++i)
{
stringstream ss;
ss << "unencrypted" << i << ".txt";
file = ss.str();
inputFile.open(file.c_str(), ios::in);
if (inputFile.fail())
{
cout << "\n An error has occurred.";
}
else
{
while (!inputFile.eof())
{
getline(inputFile, text);
cout << "\n " << file << " = " << text << "\n\n";
int applyCeasarShift(string,string);
applyCeasarShift(text, file);
}
inputFile.close();
}
}
return (0);
}
以下是xstring的调试行:
#ifdef _DEBUG
_CRTIMP2_PURE void __CLRCALL_PURE_OR_CDECL _Debug_message(const wchar_t *message, const wchar_t *file, unsigned int line)
{ // report error and die
if(::_CrtDbgReportW(_CRT_ASSERT, file, line, NULL, message)==1)
{
::_CrtDbgBreak();
}
}
提前感谢您的帮助。
编辑:在Return语句中发生错误,在xstring的提取中,黄色箭头指向“:: _ CrtDbgBreak();”
编辑2:
xstring:
basic_string(const _Elem *_Ptr)
: _Mybase()
{ // construct from [_Ptr, <null>)
_Tidy();
assign(_Ptr);
}
xutility:
template<class _Ty> inline
void _Debug_pointer(const _Ty *_First, _Dbfile_t _File, _Dbline_t _Line)
{ // test iterator for non-singularity, const pointers
if (_First == 0)
_DEBUG_ERROR2("invalid null pointer", _File, _Line);
}
stdthrow:
#ifdef _DEBUG
_CRTIMP2_PURE void __CLRCALL_PURE_OR_CDECL _Debug_message(const wchar_t *message, const wchar_t *file, unsigned int line)
{ // report error and die
if(::_CrtDbgReportW(_CRT_ASSERT, file, line, NULL, message)==1)
{
::_CrtDbgBreak();
}
}
希望这是正确的东西。
答案 0 :(得分:4)
问题是string
是batchCipherFiles
的返回类型,但正在返回return (0);
:更改返回类型或返回string
。
我认为return (0);
会隐式转换为std::string((char*)0);
,导致崩溃。 std::string
constructor州的文档:
使用s指向的以null结尾的字符串的内容构造字符串。字符串的长度由第一个空字符决定。 s不能是NULL指针。
答案 1 :(得分:1)
如果在return语句上发生错误,则其他一些代码可能正在使用返回值作为指针值。 C ++标准指定在分配给指针时将0视为与NULL相同,这可能是您的问题。