Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.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++ 如果arrayposition是int。。。? 向量inputarrayconverted={…}; 尝试 { if(atoi(inputarrayconverted[p].c_str())>=0) { inputarrayconverted[p]=“n”; } } catch(int e){}`_C++_Vector_Int - Fatal编程技术网

C++ 如果arrayposition是int。。。? 向量inputarrayconverted={…}; 尝试 { if(atoi(inputarrayconverted[p].c_str())>=0) { inputarrayconverted[p]=“n”; } } catch(int e){}`

C++ 如果arrayposition是int。。。? 向量inputarrayconverted={…}; 尝试 { if(atoi(inputarrayconverted[p].c_str())>=0) { inputarrayconverted[p]=“n”; } } catch(int e){}`,c++,vector,int,C++,Vector,Int,它不起作用。它给我一条“调试断言失败!”消息。我要做的就是验证数组位置是否为int,将其值更改为“n” 错误是 “调试断言失败 文件:vector 表达式:向量下标超出范围“ 然而,为什么我的try块没有捕捉到这一点?这是我的问题 这是堆栈跟踪。(我相信) msvcp100d.dll!590599f3() [以下帧可能不正确和/或缺失,没有为msvcp100d.dll加载符号] 范例作业2 C Plus.exe!STD::Vector::运算符[](未签名int×POS=0)行932 +0x17

它不起作用。它给我一条“调试断言失败!”消息。我要做的就是验证数组位置是否为int,将其值更改为“n”

错误是 “调试断言失败

文件:vector 表达式:向量下标超出范围“

然而,为什么我的try块没有捕捉到这一点?这是我的问题

这是堆栈跟踪。(我相信)

msvcp100d.dll!590599f3()
[以下帧可能不正确和/或缺失,没有为msvcp100d.dll加载符号]
范例作业2 C Plus.exe!STD::Vector::运算符[](未签名int×POS=0)行932 +0x17字节C++
范例作业2 C Plus.exe!WMIN(int ARCC=1,WCHARGET**ARGV= 0x0314AF8)行148 +0x12字节C++
范例作业2 C Plus.exe__tmainCRTStartup()行552+0x19字节C
范例作业2 C Plus.exe!wmainCRTStartup()行371 C
内核32.dll!7647339a()
ntdll.dll!77909ef2()
ntdll.dll!77909ec5()

变量
p
包含的值超出向量中元素数量的范围。(要么是负数,要么太大,要么数组是空的。)断言是告诉您开发过程中出现了问题,而异常处理运行时问题。我不太了解VisualStudio,所以我不确定他们的标准库版本是否有一个标志,您可以设置该标志以从断言切换到异常。(可能只是构建版本就可以了?

vector上的
操作符[]()
访问函数不会对越界访问抛出异常-这只是未定义的行为。这样做的目的是,知道自己处理的索引值在一定范围内的代码不必为库不必要地对其进行双重检查而付出代价

您将获得一个调试断言,因为调试库确实执行了检查,但它是以您看到的断言的形式执行的。调试生成生成生成可以在调试生成中捕获但不能在发布生成中捕获的异常是不合适的

如果要检查边界访问,请使用执行类似访问的
vector::at()
,但会检查边界并引发异常:

at()的成员函数提供对容器的边界检查访问 元素。如果n>=a.size(),则at()抛出\u范围之外的\u


因此,您需要捕获
std::out\u of_range
而不是
int
,并且您需要
#include
来获取声明。

为什么我的编译器(VS2010)会给我一个“调试断言失败!”?这似乎是完全可以接受的代码……当您点击断言时,堆栈跟踪是什么样子的?哪个调用是断言<代码>atoi()<代码>c_str()?数组赋值?根据
atoi
的行为,当它不能转换时,我也要小心,返回的值是零,而不是负。它很笨重,但我会使用sscanf或stringstream进行转换,这样您就可以知道它是否成功转换。使用
atoi
无法区分包含“0”的字符串和错误。您希望
int
从哪里发出
throw
n?还有更好的方法。
    vector <string> inputarrayconverted = { ... };

    try
    {
    if (atoi(inputarrayconverted[p].c_str()) >= 0)
    {
        inputarrayconverted[p] = "n";
    }
}
catch (int e) { }`
msvcp100d.dll!590599f3()
[Frames below may be incorrect and/or missing, no symbols loaded for msvcp100d.dll] 
Paradigms Assignment 2 C Plus Plus.exe!std::vector<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::allocator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > >::operator[](unsigned int _Pos=0)  Line 932 + 0x17 bytes C++
Paradigms Assignment 2 C Plus Plus.exe!wmain(int argc=1, wchar_t * * argv=0x00314af8)  Line 148 + 0x12 bytes    C++
Paradigms Assignment 2 C Plus Plus.exe!__tmainCRTStartup()  Line 552 + 0x19 bytes   C
Paradigms Assignment 2 C Plus Plus.exe!wmainCRTStartup()  Line 371  C
kernel32.dll!7647339a()     
ntdll.dll!77909ef2()    
ntdll.dll!77909ec5()