在句子中找到回文

时间:2015-10-26 20:18:05

标签: c string palindrome

我正在尝试编写一段C代码,它接受一个句子并返回该句子中的所有回文,每个都在一个新行中。例如,句子"我喜欢竞争公民赛车"会回来: 公民 赛车

我尝试使用一些调试软件(lldb,因为我是一名mac用户),但发现它有点令人困惑。下面的代码就是我写的。它返回了一个分段错误,我在我的程序中识别它时遇到了麻烦。

int is_palin(char c[], int length) 
{
  int front = 0;
  int back = length - 1;   /*  account for length starting at 0  */  
    if (length % 2 == 0){    /*  check for even palindromes */
          int middle = (length /2) -1 ;
        while (front< middle + 1){
              if (c[front] != c[back]){
                  return 0;}
        front = front + 1;
        back = back -1;

        }  
    }
    else {                                    /*  check for odd palindromes */
          int middle = ((back - 2) / 2 ) + 1; 
              while (front != middle){
                    if (c[front] != c[back]){
                          return 0;}

              front = front + 1;
              back = back -1;}
          }
                return 1;
}

int is_delimiting_char(char ch)
{
if(ch == ' ')     //White space
  return 1;
else if(ch == ',')    //Comma
  return 1;
else if(ch == '.')    //Period
  return 1;
else if(ch == '!')    //Exclamation
  return 1;
else if(ch == '?')    //Question mark
  return 1;
else if(ch == '_')    //Underscore
  return 1;
else if(ch == '-')    //Hyphen
  return 1;
else if(ch == '(')    //Opening parentheses
  return 1;
else if(ch == ')')    //Closing parentheses
  return 1;
else if(ch == '\n')   //Newline (the input ends with it)
  return 1;
else
  return 0;
} 


/////////////////////////////////////////////

//---------------------------------------------------------------------------
// MAIN function
//---------------------------------------------------------------------------


int main (int argc, char** argv) {

  char input_sentence[100];  
  int i=0;
  char current_char;
  int delimiting_char;
  char word[20];
  int word_length;
  int have_palindrome = 0;


  /////////////////////////////////////////////    



  /////////////////////////////////////////////

  /* Infinite loop 
   * Asks for input sentence and prints the palindromes in it
  * Terminated by user (e.g. CTRL+C)
  */

while(1) {

 i=0;       

 print_char('\n'); 

 print_string("input: ");

 /* Read the input sentence. 
  * It is just a sequence of character terminated by a new line (\n)   character.
  */

 do {           
  current_char=read_char();
  input_sentence[i]=current_char;
  i++;
} while (current_char != '\n');

///////////////////////////////////////////// 

print_string("output:\n");
int char_index = 0;         

for(int k=0; k<i; k++)  {   
 palin = 1;
  current_char = input_sentence[k];
  delimiting_char = is_delimiting_char(current_char);


if(delimiting_char) {
  if (char_index > 0) {     //Avoids printing a blank line in case of consecutive delimiting characters.
    word[char_index++] = '\n';    //Puts an newline character so the next word in printed in a new line.
      word_length = word_length + 1;
      if (is_palin(word, word_length) && word_length > 1){
        have_palindrome = 1;
        for(int j=0; j<char_index; j++)  {    
      print_char(word[j]);  
    }
      word_length = 0;
       char_index = 0; 
      }
} }
else {
  word[char_index++] = current_char;
  word_length = word_length + 1;
}

                    }


if (have_palindrome == 0){
  print_string("Sorry!  No palindromes found!"); }
 }

return 0;

}  

还想知道是否有人有好的视频或网站学习如何使用lldb,当之前从未使用过任何类型的东西。谢谢!

1 个答案:

答案 0 :(得分:0)

这里有几个问题:

  • word_length在首次使用时未初始化,因此word_length = word_length + 1等语句会导致未定义的行为。实际上,您有两个不同的变量char_indexword_length,它们应始终具有相同的值。而不是通过麻烦来保持它们同步,而只使用一个变量。
  • 只有在找到回文时,才会将char_indexword_length重置为零。当然,你应该在每个单词后重置。
  • palin = 1;可能是旧代码的剩余部分。您还应该在每行后重置have_palindrome。通常,在定义变量时应该更加小心。
  • 通过在单词上添加换行符,您可以更轻松地进行打印,但是您永远不会找到回文,因为在检查回文时会考虑到最后的换行符。
  • 您使用read_char阅读的代码(可能是getchar的别名)需要检查输入的结尾。
  • 您无需区分偶数和奇数大小的回文。只要做出front < back的条件并完成它。奇数大小的回文的中间特征并不重要。 (这不是错误,你的代码只是不必要的复杂。)