1

Тема: Керніган і Рітчі вправа 1-21

Продовження теми по перекладу

Exercise 1-21. Write a program entab that replaces strings of blanks by the minimum number of tabs and blanks to achieve the same spacing. Use the same tab stops as for detab.
When either a tab or a single blank would suffice to reach a tab stop, which should be given
preference? 

Напишіть програму, яка замінює рядки пробілів мінімальним числом табуляцій і пробілів таким чином щоб досягти такої ж довжини.
Тут все зрозуміло.
Використайте тіж самі символи кінця табуляцій, що і в програмі detab
Про які tab stops, кінці табуляцій, іде мова?

2

Re: Керніган і Рітчі вправа 1-21

Дивіться останній пост в попередній темі.
+ http://www.computerhope.com/jargon/t/tabstop.htm

Більш правильно перекладати "зупинка табуляції" або місце де зупинився курсор після символу табуляції.

3

Re: Керніган і Рітчі вправа 1-21

Намагаюсь виконати дану вправу, та чогось не виходить, процес повертає -1073741819

#include <stdio.h>
#define MAX 100 //Максимальний розмір масиву
#define TS 5 //Еквівалентна кількість пробілів до однієї табуляції
int entab(char array[]);

main(){
    int j;
    char arr[MAX];
    while((j = entab(arr)) < MAX){
    printf("%s\n", arr); //Масив
    printf("%d\n", i); //Розмір масиву
    }
    return 0;
}

int entab(char arr[]){
    int c, i, sc; //sc лічильник пробілів
    sc = i = 0;

    while( (c = getchar())!=EOF && i<MAX && c!='\n' ){
        arr[i] = c;
        if(c == ' ')
            sc++;
        i++;        
        if(arr[i-1] = ' ' && c!=' ' && sc > 1){
            i = i - sc; //Переміщуємо каретку в місце, де знаходиться перший пробіл із рядку пробілів більше 1
            for(sc = sc; sc>TS; sc-TS){ //Якщо кількість пробілів більше 5, замінити на табуляцію
                arr[i] = '\t';
                i++;        
            }
            for(sc = sc; sc>0; sc-1){
                arr[i] = ' '; //Все що залишилось замінити пробілами
                i++; //Перейти на наступний елемент
            }
            arr[i] = c; //Вставити сюди символ
            sc = 0;//Обнулити sc
        }
    }
    return i;
}

Якщо не використовувати шматок коду по заміні пробілів - то в кінець масиву додаються якісь дивні символи ░ ↕

4

Re: Керніган і Рітчі вправа 1-21

Знайшов хороше рішення даної задачі
http://clc-wiki.net/wiki/KR2_Exercise_1-21
3 по порядку, починається із:

/*-------------------------------------------------*/
/* Another solution for review purpose */