Игнорирование символов определённой длины в строке (Си) - C (СИ)
Формулировка задачи:
Добрый день!
Имеется код, который преобразует двоичный код в символы. Необходимо доработать его так, чтобы при выводе программа игнорировала слова, длина которых меньше или равна N.
Пример: вводим 01001000 01100101 01101100 01101100 01101111 00100000 01001000 01101001 00100000 01110111 01101111 01110010 01101100 01100100 00100001 // == Hello Hi world!
получаем (при N = 3) Hello world!
P.S: запрещено работать с динамической памятью, инклюдить string.h
Код:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define DELIM ' '
int main(void)
{
char *ptr, ch[9];
char in[255];
char out[255];
ch[8]='\0';
int i = 0;
int N = 3;
fgets(in, sizeof(in), stdin);
for (ptr=in, i=0; * ptr; ptr++)
{
if (i == 8)
{
printf("%c", (char)strtol(ch, 0, 2));
i = 0;
}
if (*ptr != DELIM)
ch[i++] = *ptr;
}
return 0;
}Решение задачи: «Игнорирование символов определённой длины в строке (Си)»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main(void)
{
char *pEnd;
char in[255];
char out[255];
int N = 3, n=0;
fgets(in, sizeof(in), stdin);
for (char ch=(char)strtol(in, &pEnd, 2); ch; ch = (char)strtol(pEnd, &pEnd, 2)) {
if ((ch==' ' | ch=='\n' | *pEnd == '\n')){
if (n >= N) {
out[n++] = ch;
out[n] = '\0';
printf("%s", out);
}
n=0;
}
else {
out[n++] = ch;
}
}
//*(pOut++) = ch;
//*pOut = '\0';
//for (char *ptr=out; *ptr; ptr++ )
return 0;
}
Объяснение кода листинга программы
- В начале программы подключаются необходимые библиотеки: stdio.h, stdlib.h и ctype.h
- Затем определены и инициализированы переменные: — pEnd — указатель на конец строки; — in — массив для чтения строки с терминала; — out — массив для записи отфильтрованной строки; — N — количество игнорируемых символов определенной длины; — n — счётчик символов в выходной строке; — ch — текущий символ; — pEnd — указатель на текущий символ.
- Далее, с помощью функции fgets(), в массив in считывается строка с терминала.
- Используя цикл for и функцию strtol(), из считанной строки извлекаются символы определенной длины (в данном случае — 2 символа).
- Если извлечённый символ является пробелом, переносом строки или концом строки, то проверяется условие: — если счётчик n больше или равен N, то текущий символ добавляется в выходную строку, а счётчик n сбрасывается в ноль; — если счётчик n меньше N, то текущий символ добавляется во входную строку без изменений; — счётчик n сбрасывается в ноль.
- Если извлечённый символ не является пробелом, переносом строки или концом строки, то он добавляется во входную строку без изменений.
- В конце программы возвращается значение 0, что означает успешный конец работы программы.