isdigit的分段错误问题

时间:2014-03-03 21:31:30

标签: c++ segmentation-fault

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

这是有问题的功能。

bool checkInt(string myString){
for (int i=0; i<myString.length; i++){
    if (!isdigit(myString[i])){
        return false;
    };
    return true;
}

我在for和if语句的第二行和第三行得到段错误 如果它有帮助,这里也是构建日志。

C:\Users\conner\Desktop\programing\for dummes\main.cpp: In function 'bool checkInt(std::string)':
C:\Users\conner\Desktop\programing\for dummes\main.cpp:78:30: error: invalid use of member function (did you forget the '()' ?)
C:\Users\conner\Desktop\programing\for dummes\main.cpp:84:1: warning: control reaches end of non-void function [-Wreturn-type]

5 个答案:

答案 0 :(得分:2)

编译器错误不是“段错误”。错误消息告诉您源代码中存在错误,编译器无法完成编译程序。

在您的情况下,错误似乎在使用myString.length。这应该是myString.length(),因为length是一个成员函数,必须调用(()}。

答案 1 :(得分:1)

在for循环中,

i被比较为大于,不小于。这导致myString[i]内的字符串缓冲区外的访问和分段错误。此外,应使用myString.length()代替myString.length。 (根据manlio的评论)。

答案 2 :(得分:0)

更改为i < myString.length();

答案 3 :(得分:0)

您遇到了分段错误,因为您似乎运行了一个使用编译错误构建的对象模块。例如,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() );
}

您还可以使用标头std::all_of

中声明的标准算法<algorithm>

例如

inline bool checkInt( const string &myString )
{
    return std::all_of( myString.begin(), myString.end(), 
                        []( char c ) { return ::isdigit( c ); } );
}

答案 4 :(得分:0)

你的代码错过了一个大括号。您应该测试i是否小于myString.length,而不是更高。关闭if分支后不需要分号。

bool checkInt(string myString)
{
    for (int i=0; i < myString.length(); i++)
        if(isdigit(myString[i]))
            return false;

    return true;
}