#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 (поскольку счетчик цикла будет увеличиваться в конце цикла).