我的 C 代码中的错误"segmentation fault"


#include<string.h>
#include<stdio.h>

int firstState(char s[], int length);
int secondState(char s[], int length);
int thirdState(char s[], int length);
int forthState(char s[], int length);
int main()
{
    char string[10];
    gets(string);
    if( firstState(string, 0) )
        printf("Acceptn");
    else
        printf( "Not acceptn" );
    return 0;
}
int firstState(char s[], int length)
{  
    if(s[length] == 'a')
        return (secondState(s, length++));
    else if(s[length] == 'b')
        return firstState(s, length++);
    else
        return 0;
}
int secondState(char s[], int length)
{  
    if(s[length] == 'a')
        return secondState(s, length++);
    else if(s[length] == 'b')
        return thirdState(s, length++);
    else
        return 0;
}
int thirdState(char s[], int length)
{  
    if(s[length] == 'a')
        return secondState(s, length++);
    else if(s[length] == 'b')
        return forthState(s, length++);
    else
        return 0;
}
int forthState(char s[], int length)
{  
    if(s[length] == 'a')
        return secondState(s, length++);
    else if(s[length] == 'b')
        return firstState(s, length++);
    else
        return 0;
}

它给了我一个分段错误或核心倾倒我很困惑!!有人可以解释为什么它给了我这种错误吗????并告诉如何调试以使我的代码运行得非常清晰!!

我真的很厌倦这个:(

对不起,我的英语不好

你有无限递归,

return (secondState(s, length++));

传递length参数是增量之前的length值,因此您只查看第一个char

length 参数作为 length + 1 传递,并检查length是否小于 10(char数组的长度 string )。

另一方面,

gets(string);

是非常不安全的,如果输入超过九个字符,则在分配的内存之外写入。用

fgets(string, sizeof string, stdin);

相反。


好吧,由于它只需要上述修复和一个返回值的更改,因此大部分逻辑是正确的,即固定代码:

// #include<string.h> <- We don't use that
#include<stdio.h>
// Match the grammar (a+b)*abb
int firstState(char s[], int length);    // nothing of the suffix matched
int secondState(char s[], int length);   // matched one character of the suffix
int thirdState(char s[], int length);    // matched two
int forthState(char s[], int length);    // matched the complete suffix
int main()
{
    char string[10];
    // Get a 0-terminated string into the buffer.
    fgets(string, sizeof string, stdin);
    if( firstState(string, 0) )
        printf("Acceptn");
    else
        printf( "Not acceptn" );
    return 0;
}
int firstState(char s[], int length)
{  
    if(s[length] == 'a')  // first character of suffix matched
        return (secondState(s, length+1));
    else if(s[length] == 'b')  // nothing matched
        return firstState(s, length+1);
    else    // end of string in not-accepting state
        return 0;
}
int secondState(char s[], int length)
{  
    if(s[length] == 'a')  // the old matched 'a' wasn't part of the suffix, the new may be
        return secondState(s, length+1);
    else if(s[length] == 'b') // now matched two characters of the suffix
        return thirdState(s, length+1);
    else    // end of string in not-accepting state
        return 0;
}
int thirdState(char s[], int length)
{  
    if(s[length] == 'a')  // last three chars aba, the last 'a' could be part of the suffix
        return secondState(s, length+1);
    else if(s[length] == 'b')  // full suffix matched
        return forthState(s, length+1);
    else    // end of string in not-accepting state
        return 0;
}
int forthState(char s[], int length)
{  
    if(s[length] == 'a')  // another char, start a new candidate for the suffix
        return secondState(s, length+1);
    else if(s[length] == 'b')  // another char, can't be part of the suffix, start over
        return firstState(s, length+1);
    else        // end of string in accepting state, yay!
        return 1;
        // return s[length] == '';
        // if characters other than 'a' and 'b' need not signal the end of the string
}

分段错误是一种访问冲突,即当程序尝试访问 emmory 时,它不应该 http://en.wikipedia.org/wiki/Segmentation_fault。

在您的情况下,它是由不安全的数组索引引起的,例如

int firstState(char s[], int length)
{
...
return firstState(s, length++);
...
}

您实际上不会检查新长度是否仍在边界内,因此如果字符串没有以 null 结尾(在您的情况下可能不是这样),那么您将有一个无限循环导致 SegFault。

对于调试,使用GUI将是最明智的方法,尝试Windows上的Visual Studio,其他所有内容的Eclipse。

相关内容

  • 没有找到相关文章

最新更新