В строке, состоящей из групп нулей и единиц, разделенных пробелами, найти количество групп с пятью цифрами

В строке, состоящей из групп нулей и единиц, разделенных пробелами, найти количество групп с пятью цифрами.

void main() {

printf("Type array: ");
char array[256];
fgets(array, 100, stdin);


int arrayLength = strlen(array);
int numOfSymbols = 0;
int wordCounter = 0;


    for(int i = 0; i < arrayLength - 1; i++) {
        if (array[i] == 0 || 1 && array[i + 1] != ' ') {
            numOfSymbols++;         // если 0 || 1 добавляем символ в счетчик
        }

        if (array[i] == ' ') {  // если есть пробел - обнуление счетчика
            numOfSymbols = 0;
        }

        if(numOfSymbols == 5) {
            wordCounter++;      // есть слово с 5 символами
            numOfSymbols = 0;   // Обнуление счетчика
        }


    }
    printf("words - %d", wordCounter);
}

Здравствуйте, битый час бьюсь с реализацией проверки на > 5 символов, хотел бы попросить у вас помощи. Спасибо.


Ответы (2 шт):

Автор решения: Harry

Примерно так, но я просто считаю количество групп непробельных символов длиной 5 (не проверяя, из чего они состоят, ибо сказано у вас о "строке, состоящей из групп нулей и единиц, разделенных пробелами" - так что проверять не нужно. Но если нужно, допишите сами. Только не так:

array[i] == 0 || 1 && array[i + 1] != ' '

потому что первое - приоритеты операций приведут к

array[i] == 0 || (1 && array[i + 1] != ' ')

второе - вы сравниваете именно с символом с кодом нуль (и пытаетесь сравнить с символом с кодом один), а не с символами '0' и '1' - вокруг пробела вы же кавычки нарисовали?)

Третье - здесь нет никакого сравнения с 1:

array[i] == 0 || 1

Единица просто выступает в роли "истинно" (true) и все. если уж вы хотите сравнивать "а не равно ли 0 или 1) - то

array[i] == 0 || array[i] == 1

но помните о том, что я писал раньше...

Словом, с учетом написанного выше - что я просто считаю количество групп непробельных символов длиной 5 - у меня код получился таким:

int count(const char * s)
{
    int cnt = 0, len = 0;
    char last = ' ';
    for(const char * c = s; ; ++c)
    {
        if (*c == ' ' || *c == 0)
        {
            if (last != ' ' && len == 5) ++cnt;
            len = 0;
            last = ' ';
            if (*c == 0) break;
        }
        else
        {
            ++len;
            last = *c;
        }
    }
    return cnt;
}
→ Ссылка
Автор решения: Sergey

Как-то так:

#include <string.h>
#include <stdio.h>

// Проверяем, что строка состоит только из пробелов, "0" и "1"
int IsValid(char *str) {
    int j;
    
    for(j=0; j<strlen(str)-1; j++) {
        if (str[j] == '0') continue;
        if (str[j] == '1') continue;
        if (str[j] == ' ') continue;
        return -1;
    }
    return 0;
}


// Описатель слова из строки
struct word {
    int beg_index;
    int end_index;
    int wrd_len;
};

// Проверка на начало слова
int is_begin(char *str, int pos, int len) {

    if (pos == 0) return 1;
    if (pos == len-1) return 0;
    if ( (str[pos-1] == ' ') && (str[pos] != ' ' ) ) return 1;
    return 0;
}

// Проверка на окончание слова
int is_end(char *str, int pos, int len) {

    if (pos == 0) return 0;
    if (pos == len-1) return 1;
    if ( (str[pos-1] != ' ') && (str[pos] == ' ' ) ) return 1;
    return 0;
}

// Главная функция
int main(int argc, char *argv[]) {

printf("Type array: ");
char array[256];
char tmp[256];

// Предположим, что в строке не более 100 слов
struct word wrd[100];

int arrayLength;
int beg_cnt=0, end_cnt=0;
int wordCounter = 0;
int i;

    fgets(array, 100, stdin);
    arrayLength = strlen(array);
    // Убираем символ перевода строки
    if (array[arrayLength-1] == '\n') {
        array[arrayLength-1] = '\0';
        arrayLength--;
    }
        
    printf("Длина строки : %d\n", arrayLength);
    if (IsValid(array)) {
        printf("Строка содержит недопустимые символы %s\n", array);
        return -1;
    }

    for(int i = 0; i < arrayLength; i++) {
        if (is_begin(array, i, arrayLength)) {
            wrd[beg_cnt].beg_index = i;
            beg_cnt++;
        }
        if (is_end(array, i, arrayLength)) {
            wrd[end_cnt].end_index = i;
            end_cnt++;
        }
    }

    // Считаем длину слов
    if(beg_cnt != end_cnt) {
        printf("Счётчики начала и конца слов не совпадают! %d != %d\n", beg_cnt, end_cnt);
        return -1;
    }
    printf("Всего слов в строке %d\n", beg_cnt);
    for (i=0; i<beg_cnt; i++) wrd[i].wrd_len = wrd[i].end_index - wrd[i].beg_index;
     
    // Печааем результаты
    for (i=0; i<beg_cnt; i++) {
        if (wrd[i].wrd_len == 5) wordCounter++;
        strncpy(tmp, &array[wrd[i].beg_index], wrd[i].wrd_len);
        printf("'%s'\n", tmp);
    }
        
    printf("Слов, длинной ровно 5 символов найдено %d.\n", wordCounter);
}

Тогда при запуске программы получаем:

$ ./a.out 
Type array: 1 10 101 1010 10101 00000 11111 11111111111 000000000000
Длина строки : 56
Всего слов в строке 9
'1'
'10'
'101'
'1010'
'10101'
'00000'
'11111'
'11111111111'
'00000000000'
Слов, длинной ровно 5 символов найдено 3.
→ Ссылка