#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("Accept\n");
else
printf( "Not accept\n" );
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;
}
它给了我一个分段错误或核心倾倒我很困惑!!! 谁能解释为什么它给了我这种虫子???? 并告诉如何调试以使我的代码运行得非常清楚!!
我对此感到很累:(
抱歉我的英文不好
答案 0 :(得分:7)
你有一个无限递归,
return (secondState(s, length++));
传递的length
参数是增量前length
的值,所以你只能查看第一个char
。
将length
参数传递为length + 1
,并检查length
是否小于10(char
数组string
的长度)。
另一方面,
gets(string);
非常不安全,如果输入超过9个字符,则在分配的内存之外写入。使用
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("Accept\n");
else
printf( "Not accept\n" );
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] == '\0';
// if characters other than 'a' and 'b' need not signal the end of the string
}
答案 1 :(得分:3)
分段错误是一种访问冲突,即当程序试图访问emmory时,它不应该http://en.wikipedia.org/wiki/Segmentation_fault。
在你的情况下,它是由不安全的索引到数组引起的,例如
int firstState(char s[], int length)
{
...
return firstState(s, length++);
...
}
你实际上并没有检查新长度是否仍然在边界内,所以如果字符串不是以空值终止的,那么它可能不是你的情况,那么你将有一个无限循环导致SegFault。
对于调试,使用GUI将是最理智的方法,在Windows上尝试Visual Studio,在其他所有内容上尝试Eclipse。