isdigit 的分段错误问题



>我有一个函数,可以检查字符串中是否有任何非数字字符并返回布尔值。但是当我通过调试器运行它时,我遇到了分段错误。

这是有问题的函数。

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 ); } );
}

相关内容

  • 没有找到相关文章

最新更新