Подсчет символов подстроки в строке

#c #string #for-loop #if-statement

#c #строка #for-цикл #if-оператор

Вопрос:

Я пишу функцию, которая принимает входную строку, состоящую из сочетания ‘o’, ‘g’ и ‘c’. Для каждого из этих символов в строке печатается определенный символ. Однако для символа ‘g’ я хотел бы подсчитать, сколько g находится в строке в строке. Вот код, который у меня есть на данный момент:

 void printSymbol(char *str) // takes
{
  int i; // counter for entire string
  int k; // counter for substring ('g' char)
  int count = 0; //stores amount of consecutive g's in substring

  for (i = 0; str[i] != ''; i  ) //looping until null term.
  {
    if (str[i] == 'o')
      printf("==========n"); //symbol for o
    if (str[i] == 'c')
      printf(" ~~~~~~~~ n"); //symbol for c
    if (str[i] == 'g') //if character is g
    {
      for(k = i; str[k] == 'g'; k  ) //will loop through string starting at first g until next character is NOT g
      {
        count  ; //count amount of consecutive g
      }
      printf("%dn", count); //printing number of g's in a row
      if (count % 3 == 2) //All of these if statements are printing.
        printf("R==2n");
      if (count % 3 == 1)
        printf("R == 1n");
      if (count % 3 == 0)
        printf("R == 0n");

      count = 0; // resets count for next set of consecutive g's in string
    }
  }
}
  

Проблема, с которой я сталкиваюсь, заключается в том, что он печатает все операторы if в цикле for для символа g. Если в строке 3 g, будет выведено R = 0, затем R = 2 и R = 1, потому что он будет перебирать каждый g, и, таким образом, остаток меняется. Как мне остановить это? Я хотел бы записать остаток для всего набора последовательных g один раз. Итак, если есть 3 g, я хотел бы напечатать R = 0, а затем сбросить значение счетчика.

Ответ №1:

Вы не обновляете свою i переменную при проверке наличия последовательных символов g. Ваш внутренний for цикл, который проверяет наличие последовательных символов g, использует отдельную переменную цикла, k но поскольку i переменная (счетчик основного цикла) не обновляется, строка последовательных символов g будет проверяться несколько раз.

Например.

Предположим, что ваша строка «… ggg …». Тогда при первом столкновении с этой строкой внутренний for цикл проверит количество символов g и обнаружит, что оно равно 3. Затем он будет распечатан R == 0 , сбросит count значение 0 и вернется к основному for циклу.

Однако затем внешний for цикл будет видеть строку как «gg …» и она снова войдет во внутренний for цикл. На этот раз count было бы 2 и R == 2 было бы распечатано.

Затем этот процесс будет повторен в последний раз. Обрабатываемая строка — «g …». На этот раз count будет равна 1 и R == 1 будет распечатана.

Чтобы решить эту проблему, вам просто нужно обновить i переменную, добавив количество найденных вами g символов — 1 (поскольку счетчик цикла будет увеличиваться в конце цикла).