用于查找文本中有多少单词不包含特定字符的程序

问题描述 投票:0回答:2

以下程序在屏幕上不打印任何内容的情况下运行,可能是因为循环超过了空字符。我无法理解为什么以及如何发生这种情况,以及如何解决它。

//program to find how many word in the text doesn't contain p char

#include<stdio.h>
#include<stdbool.h>
#define space ' '

void find_word(char s[]) {
  bool wordfound = false;

  int i, j = 0, word = 0;
  i = 0;

  while (s[i]) { //s[i]!='\0'  does not

    if (s[i] != 'p' && s[i + 1] != space) { //for the first word 
      wordfound = true;
      word++;
    }

    wordfound = false;

    if (s[i] == space && s[i + 1] != space) { //for more than one word in the text 
      for (j = i + 1; s[j] != space; j++)
        if (s[j] != 'p' && s[j + 1] != space)
          wordfound = true;
    }
    if (wordfound) {
      word++;
    }
    wordfound = false;
    i = j;
    i++;
  } //end while loop

  printf("Number of words not contain p character%d\n\n", word);

}

int main(void) {
  char s[] = {"pppp zzzz ppp ssss dfg sfsfdsf"};
  find_word(s);
  return 0;
}
c string search
2个回答
0
投票

这段代码存在一些问题,但主要的一点是在循环内部将j分配给i会导致无限循环,因为while(s [i])条件永远不会满足。你为什么不试着简单,如下:

//program to find how many word in the text doesn't contain p char

#include<stdio.h>
#include<stdbool.h>
#define space ' '

void find_word(char s[]) {
  bool is_in = false;
  short words_count = 0, i = 0; 

  while (s[i]) {
      if (s[i] == 'p') { // if this letter is a 'p', mark the word
          is_in = true;
      }

      if (s[i] == space) { // if it's end of word
          if (!is_in) { // check if 'p' is present and increase the count
              words_count++;
          }
          is_in = false;
      }

      i++;
  }

  if (!is_in) { // check if the last word has 'p'
      words_count++;
  }

  printf("no. of words without p is %d\n", words_count);

}

int main(void) {
  char s[] = {"pppp zzzz ppp ssss dfg sfsfdsf"};
  find_word(s);
  return 0;
}

0
投票

根据您的输入,您似乎将for-loop终止条件设置为不可满足。

if (s[i] == space && s[i + 1] != space) { //for more than one word in the text 
  for (j = i + 1; s[j] != space; j++)
    if (s[j] != 'p' && s[j + 1] != space)
      wordfound = true;
}

在这里,您要检查输入字符串中的前导空格。如果找到它,则递增索引检查,直到到达另一个空格。如果你的字符串没有尾随空格怎么办?

而是尝试使用null和space的第二个条件来终止循环:

if (s[i] == space && s[i + 1] != space) { //for more than one word in the text 
  for (j = i + 1; s[j] != '\0' && [j] != space; j++)
    if (s[j] != 'p' && s[j + 1] != space)
      wordfound = true;
}

然后你设置:

    wordfound = false;
    i = j;
    i++;
  } //end while loop

这将继续重新设置你的循环,我不清楚你的推理,但这将无限期地运行你的循环。

如果您进行这些编辑,您的代码将终止:

#include<stdio.h>
#include<stdbool.h>
#define space ' '

void find_word(char s[]) {
  bool wordfound = false;

  int i, j = 0, word = 0;
  i = 0;

  while (s[i]) { //s[i]!='\0'  does not

    if (s[i] != 'p' && s[i + 1] != space) { //for the first word 
      wordfound = true;
      word++;
    }

    wordfound = false;

    if (s[i] == space && s[i + 1] != space) { //for more than one word in the text 
      for (j = i + 1; s[j] && s[j] != space; j++)
        if (s[j] != 'p' && s[j + 1] != space)
          wordfound = true;
    }
    if (wordfound) {
      word++;
    }
    wordfound = false;
    i++;
  } //end while loop

  printf("Number of words not contain p character%d\n\n", word);

}

int main(void) {
  char s[] = {"pppp zzzz ppp ssss dfg sfsfdsf"};
  find_word(s);
  return 0;
}

输出:

Number of words not contain p character24
© www.soinside.com 2019 - 2024. All rights reserved.