[cdev] Задание по утилите Echo

Grigoriy A. Sitkarev sitkarev на komitex.ru
Пн Мар 15 19:15:26 MSK 2010


Очень много замечаний.

У меня ощущение что это писали не вы. Придётся с вами очно встречаться
перед сдачей.

1. Прочтите LKCS и следуйте этому стилю, я неоднократно упоминал где это
можно сделать. Пересмотрите архивы подписки -
http://wiki.syktsu.ru/pipermail/cdev/.

2. В Си нельзя делать вложенные функции, откуда это у вас - я не знаю.

3. Файлы с исходным текстом должны иметь расширение `*.c'.

4. Комментарии в Си начинаются с `/*' и заканчиаются  `*/'. И хотя
большинство современных компиляторов понимают и стиль C++ `//' но лучше
пользовать родной стиль языка.

5. Так как, ещё раз повторюсь, кто-то писал вам это - весь исходник
перекомментирован. Даже совсем очевидные вещи, где комментировать не надо.

Программу на помойку можно выкидывать. Она должна компилироваться gcc
для начала.

Дизайн программы не верный, у вас могут быть опции -n и -e одновременно.

Теперь по вашим вопросам.

1. Ходить посимвольно можно очень просто. Если у вас есть указатель на
первый символ строки, в данном случае это argv[i] то вам можно сделать
что-то вроде:

/*------------------------------*/

char *c;
...
c = argv[i];

while (*c) {
    if (*c == '\') {
        ++c;
        switch (*c) {
        case 'a':
            ...
            break;
        case 'b':
            ...
            break;
        case '\\':
            ...
            break;
        ...
        }
    } else {
        ...
    }
}

/*------------------------------*/

В этом примере показан и "скелет" обработки специальных
последовательностей - ответ на вопрос об обработке параметров `\b' и т.д.

2. Утилита echo(1) срабатывает только с двумя обратными слешами с
командной строки потому что обратный слеш имеет специальное значение для
командного интерпретатора - это ESC-символ. Поэтому если вам нужно
передать с командной строки в аргументы сам символ `\', то вам надо
вставить его два раза `\\'. Первый обратный слеш сигнализирует что
следующий символ нужно передать таким какой он есть буквально, а второй
обратный слеш сам символ, который будет передан в аргументы программе.

Если вы хотите чтобы утилита echo, запущенная с опцией -e, напечатала
символ `\' то с командной строки вы его туда целых четыре раза введёте.
Потому что первый раз это будет ESC-символ, второй раз обратный слеш для
указания специальной последовательности, третий должен быть ESC-символом
для четвёртого символа обратного слеша.

$ echo -e aa\\\\aa
aa\aa

--
Г.А.

Карабанова Елена пишет:
> Здравствуйте!
> Я разобралась с функцией getopt.
> Можете посмотреть код программы с комментариями (он прилагается), чтобы хоть понять правильным ли я путем двигаюсь
>
> У меня вопрос, как можно отследить в строке аргументов "\", чтобы можно было обработать допустим параметр - \b
> argv - это же массив указателей на аргументы (слова) которые ввел пользователей
> по идеи посимвольно смотреть нужно каждое слово, вот только как обратиться незнаю к символу
>
> и вот стандартная утилита echo, она начинает реагировать на параметр \b только после ввода \\b почему так?
> echo -e \\t 
>
>
>  






Подробная информация о списке рассылки cdev