В строке, состоящей из групп нулей и единиц, разделенных пробелами, найти количество групп с пятью цифрами
В строке, состоящей из групп нулей и единиц, разделенных пробелами, найти количество групп с пятью цифрами.
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 шт):
Примерно так, но я просто считаю количество групп непробельных символов длиной 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;
}
Как-то так:
#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.