2012-11-27 42 views
3
#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; 
} 

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

我真的厌倦了这个:(

对不起我的英语不好

+0

错误消息是否包含行号?它指的是哪里? –

+2

您正在测试的字符串是什么? –

+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。

7

你有一个无限递归,

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("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 
} 
+0

第26行:3059总线错误stdbuf --error = 0 --output = 0“$ @” –

+0

究竟产生了什么错误信息?看起来不像我得到的任何错误消息,什么是操作系统? –

+0

我使用这个在线编译器http:// run。cs50.net/ –