>我有一个函数,可以检查字符串中是否有任何非数字字符并返回布尔值。但是当我通过调试器运行它时,我遇到了分段错误。
这是有问题的函数。
bool checkInt(string myString){
for (int i=0; i<myString.length; i++){
if (!isdigit(myString[i])){
return false;
};
return true;
}
我在 for 和 if 语句的第二行和第三行得到段错误如果它有帮助,这里也是构建日志。
C:UsersconnerDesktopprogramingfor dummesmain.cpp: In function 'bool checkInt(std::string)':
C:UsersconnerDesktopprogramingfor dummesmain.cpp:78:30: error: invalid use of member function (did you forget the '()' ?)
C:UsersconnerDesktopprogramingfor dummesmain.cpp:84:1: warning: control reaches end of non-void function [-Wreturn-type]
编译器错误不是"段错误"。错误消息告诉您源代码中存在错误,编译器无法完成程序的编译。
在您的情况下,错误似乎与使用myString.length
有关。这应该是myString.length()
的,因为length
是一个成员函数,必须调用(使用 ()
)。
i
在for 循环中被比较为大于、不小于。 这会导致myString[i]
内部字符串缓冲区外部的访问和分段错误。另外,应该使用myString.length()
而不是myString.length
。(根据曼利奥的评论)。
i < myString.length();
您的代码缺少大括号。你应该测试i
是否小于myString.length
,而不是大于。不需要关闭 if 分支后的分号。
bool checkInt(string myString)
{
for (int i=0; i < myString.length(); i++)
if(isdigit(myString[i]))
return false;
return true;
}
您遇到了分段错误,因为您似乎运行了一个使用编译错误构建的对象模块。例如,MS VC++允许这样做。
您的函数存在编译错误。而不是调用成员函数长度的正确语法
myString.length()
你写的
myString.length
循环语句中的条件也无效而不是
for (int i=0; i>myString.length; i++){
至少应该有
for (int i=0; i < myString.length; i++){
正确的函数可能看起来像
bool checkInt( const string &myString )
{
string::size_type i = 0;
while ( i < myString.length() && isdigit( myString[i] ) ) ++i;
return ( i == myString.length() );
}
您也可以使用在标头<algorithm>
中声明的标准算法std::all_of
例如
inline bool checkInt( const string &myString )
{
return std::all_of( myString.begin(), myString.end(),
[]( char c ) { return ::isdigit( c ); } );
}