Если в окне терминала встречается '\n' и окно заканчивается, то машина (игнорирует символ '\n'! В результате- бред.)

Модератор: Модераторы разделов

promov
Сообщения: 384
Статус: Участник
ОС: Debian GNU/Linux

Если в окне терминала встречается '\n' и окно заканчивается, то машина

Сообщение promov »

А дело вот в чём, друзья. Одна из моих программ проверяла тексты других программ на ошибки в правильности расставления скобок. То есть я в неё тексты других программ забивал и она выдавала мне- есто ошибки или нет. Так вот, я ещё на эту программу дополнительную функцию возложил- пусть она вводимые тексты печатает. И вот в окне терминала программа выдыёт мне тексты вводимых программ, а я потом эти тексты копирую в текстовые файлы, делаю их в свою очередь, исполняемыми и снова проверяю на работоспособность. Осечек не было, пока в одной из проверяемых программ не встретился такой кусок текста

Код: Выделить всё

  int j;//Это счётчик знаков, из которых будет состоять столбец. Тоже для вывода.
   int c;

Текст программы, которая содержала этот кусок, забивался в мою программу, а потом выводился в окно терминала. И вот этот кусок тоже выводился именно в таком виде- в виде 2-х строчек. А это, учитывая, что в первой строке есть комментарий, важно. А потом, когда я текст из терминала копировал в текстовый файл, этот кусок становился таким:
int j;//Это счётчик знаков, из которых будет состоять столбец. Тоже для вывода. int c;

Как видите, получалась одна строка. Объявление переменной c становилось частью комментария и получалась не программа, а бред. Мытарился я долго, но причину всё же нашёл. Символ '\n' из окна терминала в текстовый файл не копировался потому, что ширина окна терминала случайным образом заканчивалась тогда, когда заканчивалась первая строчка. (Ну или комментарий заканчивался- кому как понятнее.) Ну вот, собственно говоря и всё. Я грешу на программу, а дело, оказывается, вот в чём. А потом, когда я ширину окна изменял, всё нормально становилось снова. Вот и получается, что от ширины окна терминала зависит, будет у меня переменная с объявлена или нет.

Кто-нибудь сталкивался с подобной проблемой? Можно ли как-то исправить программу, отвечающую за справедливое (так скажем) считывание всех символов из окна терминала- ведь тексты прогамм, из которых состоит моя ОС открыты, так ведь? Я бы потом- как нибудь у себя исправил. Спасибо.
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Спасибо сказали:
Аватара пользователя
nrg
Сообщения: 219
Статус: Энерджайзер :)
ОС: OpenSuSe 10.3

Re: Если в окне терминала встречается '\n' и окно заканчивается, то машина

Сообщение nrg »

Я так понимаю, если программа находит комментарий, то она отсекает всё, что идёт после двойного слеша в том числе и перенос строки (указанный "\n"),
OpenSuSe 10.3 на Dell Inspiron 1501 и Семпрон-3000/1024ДДР2-800/120+60+300/NVidia 8500GT.
Участник Sun Open Source User Group, Самара.
Спасибо сказали:
promov
Сообщения: 384
Статус: Участник
ОС: Debian GNU/Linux

Re: Если в окне терминала встречается '\n' и окно заканчивается, то машина

Сообщение promov »

Да, моя программа просматривает тексты других программ и если находит в них комментарии, то не рассматривает в комментариях: а правильно ли расставлены в них скобки? Это да.

Но вопрос не в этом. Вопрос в том, что когда я копирую кусочек текста из терминала в текстовый файл (независимо от того, откуда и каким образом этот кусок взят- из этой ли програмы или просто из текстового файла, содержание которого всего 2 этих строчки), то перехода на новую строку не происходит потому, что случайным образом длина первой строчки совпадает с шириной окна терминала.
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Спасибо сказали:
Аватара пользователя
azrael
Сообщения: 73
ОС: KUbuntu 8.04 Hardy Heron

Re: Если в окне терминала встречается '\n' и окно заканчивается, то машина

Сообщение azrael »

Вопрос в том, что когда я копирую кусочек текста из терминала в текстовый файл (независимо от того, откуда и каким образом этот кусок взят- из этой ли програмы или просто из текстового файла, содержание которого всего 2 этих строчки), то перехода на новую строку не происходит потому, что случайным образом длина первой строчки совпадает с шириной окна терминала.

Вам не кажется, что эта тема - феерический бред?
Вы мышкой текст копируете или как? Чем здесь ваша программа виновата? По-моему, в данном случае вам надо, ни много, ни мало, исправлять код терминала :)
Спасибо сказали:
Аватара пользователя
Liksys
Сообщения: 2910

Re: Если в окне терминала встречается '\n' и окно заканчивается, то машина

Сообщение Liksys »

promov, при всем уважении, а тебе не кажется, что жирно плодить для своей учебной программы две темы?
Спасибо сказали:
Аватара пользователя
Folderx
Сообщения: 296
ОС: fedora, mandriva

Re: Если в окне терминала встречается '\n' и окно заканчивается, то машина

Сообщение Folderx »

(promov) писал(а):Я грешу на программу, а дело, оказывается, вот в чём. А потом, когда я ширину окна изменял, всё нормально становилось снова. Вот и получается, что от ширины окна терминала зависит, будет у меня переменная с объявлена или нет.

Кто-нибудь сталкивался с подобной проблемой? Можно ли как-то исправить программу, отвечающую за справедливое (так скажем) считывание всех символов из окна терминала-

Символ \n неотображаемый

Код: Выделить всё

 17 Чтв 07:45 ~ >> echo x
x
 17 Чтв 07:45 ~ >> echo x
x
 17 Чтв 07:45 ~ >> echo x
x
 17 Чтв 07:45 ~ >>


Думаешь я вручную тут переносы расставлял ?

(promov) писал(а):Текст программы, которая содержала этот кусок, забивался в мою программу, а потом выводился в окно терминала.

попробуй printf("text\n");

И код свой полностью выложи.
Спасибо сказали:
promov
Сообщения: 384
Статус: Участник
ОС: Debian GNU/Linux

Re: Если в окне терминала встречается '\n' и окно заканчивается, то машина

Сообщение promov »

Осёл писал(а):
17.01.2008 00:13
promov, при всем уважении, а тебе не кажется, что жирно плодить для своей учебной программы две темы?
Какое там уважение, Осёл... Вы бы хоть прочли внимательнее... Программы две. Разных.
promov писал(а):
11.01.2008 00:14
ДРузья! Я написал программу, которая удаляет из текста программы комментарии.

promov писал(а):
16.01.2008 13:33
Одна из моих программ проверяла тексты других программ на ошибки в правильности расставления скобок. .
И не Ваше это дело, в конце концов- жирно, не жирно.
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Спасибо сказали:
promov
Сообщения: 384
Статус: Участник
ОС: Debian GNU/Linux

Re: Если в окне терминала встречается '\n' и окно заканчивается, то машина

Сообщение promov »

azrael писал(а):
16.01.2008 23:28
Вопрос в том, что когда я копирую кусочек текста из терминала в текстовый файл (независимо от того, откуда и каким образом этот кусок взят- из этой ли програмы или просто из текстового файла, содержание которого всего 2 этих строчки), то перехода на новую строку не происходит потому, что случайным образом длина первой строчки совпадает с шириной окна терминала.

Вам не кажется, что эта тема - феерический бред?
Вы мышкой текст копируете или как? Чем здесь ваша программа виновата? По-моему, в данном случае вам надо, ни много, ни мало, исправлять код терминала :)
Ну да, всё верно. Текст, который в терминале я копирую мышкой и потом мышкой же его в новый файл и вставляю. Ну, правильно, у меня в терминале 2 строчки, конец первой совпадает с окончанием ширины окна терминала. И поэтому (?) переноса не происходитт при копировании. Код терминала исправлять, да. Так вот я и не знаю, и потому спрашиваю.
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Спасибо сказали:
Аватара пользователя
Liksys
Сообщения: 2910

Re: Если в окне терминала встречается '\n' и окно заканчивается, то машина

Сообщение Liksys »

И не Ваше это дело, в конце концов- жирно, не жирно.

promov, ты чего, не узнал меня чтоли? :)
Осёл = Liksys :D
Пока пусть будет в отдельной теме, но на будущее, лучше пиши однотипные проблемы в одну тему.

Ну да, всё верно. Текст, который в терминале я копирую мышкой и потом мышкой же его в новый файл и вставляю. Ну, правильно, у меня в терминале 2 строчки, конец первой совпадает с окончанием ширины окна терминала. И поэтому (?) переноса не происходитт при копировании. Код терминала исправлять, да. Так вот я и не знаю, и потому спрашиваю.
Неправильный это подход. Изменять исходный текст программы при работе с новыми данными. Тебе надо почитать про файловый ввод/вывод.
Спасибо сказали:
promov
Сообщения: 384
Статус: Участник
ОС: Debian GNU/Linux

Re: Если в окне терминала встречается '\n' и окно заканчивается, то машина

Сообщение promov »

Folderx писал(а):
17.01.2008 00:54
попробуй printf("text\n");
Просьба смотреть внимательнее. У меня символ перехода на новую строку есть конец комментария. А раз так, никакой printf не поможет. Ну сам подумай, какой printf может быть в комментарии?
promov писал(а):
16.01.2008 13:33

Код: Выделить всё

  int j;//Это счётчик знаков, из которых будет состоять столбец. Тоже для вывода.
      int c;


Да если тебе нужен текст программы, чтобы посмеяться, так и скажи. Дело вовсе не в её действенности. Дело вообще не в программе. Я её привёл просто как пример того, каким образом у меня в терминале мог оказаться текст какой-либо программы. Ну вот так и мог- эта моя программа проверяет другие на правильность скобок и выводит их тексты. И она тут ни при чём (слышите, Осёл? Вопрос не о ней!)
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Спасибо сказали:
Аватара пользователя
Folderx
Сообщения: 296
ОС: fedora, mandriva

Re: Если в окне терминала встречается '\n' и окно заканчивается, то машина

Сообщение Folderx »

(promov) писал(а):Просьба смотреть внимательнее. У меня символ перехода на новую строку есть конец комментария.

А каким образом он передаётся на экран программой ?

(promov) писал(а):Мытарился я долго, но причину всё же нашёл. Символ '\n' из окна терминала в текстовый файл не копировался потому, что ширина окна терминала случайным образом заканчивалась

Не копировался кем ? Что или кто копирует из окна терминала и куда ?

(promov) писал(а):А потом, когда я ширину окна изменял, всё нормально становилось снова.

Непонятно, что становилось нормальным ?

Выложи исходник сюда. ;)
Спасибо сказали:
promov
Сообщения: 384
Статус: Участник
ОС: Debian GNU/Linux

Re: Если в окне терминала встречается '\n' и окно заканчивается, то машина

Сообщение promov »

Фолдрекс! На твою помощь не надеюсь, ибо ты ещё меньше моего шаришь в этом деле, советуя в комментарий вставить printf (эта первая причина аппелировать к начальству). Но дабы избежать упрёков типа: "Тебе помочь хотят, а ты отнекиваешься" по новой объясняю суть проблемы. Имеется программа, которая копирует входной поток. Программа классическая, взята из K&R. ВОт её исходник- это ты будешь запрашивать и это даром не нужно. Но всё же вот он.

Код: Выделить всё

#include <stdio.h>
      int main () {
       int c;
       c= getchar ();
       while (c!= EOF) {
        putchar (c);
        c= getchar ();
       }
       return 0;
      }

Входной поток представляет из себя такую последовательность символов
int j;//Это счётчик знаков, из которых будет состоять столбец. Тоже для вывода.'\n'int c;'\'

Где '\n' и '\' не наборы символов, а управляющие поледовательности. В окне терминала эта последовательность выглядит так

int j;//Это счётчик знаков, из которых будет состоять столбец. Тоже для вывода.
int c;

Видно, что в первую строку входит 79 символов. И в окно терминал входит 79 символов. Теперь: я копирую это мышью и переношу в текстовый файл, где эта последовательность выглядит вот так.

int j;//Это счётчик знаков, из которых будет состоять столбец. Тоже для вывода.int c;'\'

Разница между первым и тертьим вариантом вышенаписанного очевидна- неизвестно куда пропала управляющая последовательность '\n' Я отношу это за счёт того, что случайным образом первая строка оказалась длиной 79 символов, как и ширина окна терминала. Когда я изменяю ширину окна терминала, всё становится нормальным (вот этот момент тебе "непонятен"- и это вторая причина аппелелировать к начальству по поводу "Ты здесь чего вообще?"). А третья будет, когда ты запросишь исходник программы, которую я упомянул в самом начале и которая вообще не нужна здесь.
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Спасибо сказали:
Аватара пользователя
Skladnoy
Сообщения: 90
ОС: Debian

Re: Если в окне терминала встречается '\n' и окно заканчивается, то машина

Сообщение Skladnoy »

promov
Так в чём проблема? В терминале? Тогда пиши баг-репорт, или чини/меняй терминал. И тогда не надо запутывать людей своими программами, если они не при чём.
Спасибо сказали:
promov
Сообщения: 384
Статус: Участник
ОС: Debian GNU/Linux

Re: Если в окне терминала встречается '\n' и окно заканчивается, то машина

Сообщение promov »

Конечно, они ни при чём. Только не скажи я, как у меня в терминале оказался кусок кода, (а вот, с помощью программы) обязательно был бы вопрос: "Как? Как у тебя в терминале оказался кусок кода- объявление переменной, комментарий и объявление другой переменной? Ты промов, дурак, наверное, раз в терминал такие вещи пихаешь, их нужно в текстовый файл пихать! А дуракам не помогаем!" Ну так вот я и оговорил сразу, как оказался.
Я ничего не сочиняю- видите, с меня уже текст программы требуют, хотя он тут ни к селу ни к городу. Дальше диалог может примерно так развиваться: Нет кода- нет помощи. А то, что код для ответа не важен вообще, это дело десятое! И я же ещё виноват буду, зачем такой-сякой код не выложил, когда мне помочь хотели..
...Вы меня извините, но если Вы представили симптомы (я старался!) Ну вот Вы бы с чего начали, если бы у Вас такое было? Ну а в чём проблема- в терминале ли или ещё в чём-то, я не могу определить. Определите, пожалуйста, Вы, если можете, а я всю необходимую информацию подкину.
...Извините, да таких провокаторов на весь форум раз-два и обчёлся, но они есть и... вот. Им возражать- тему во флуд превращать. А отмалчиваться- получается, что они правы. Простите ещё раз.
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Если в окне терминала встречается '\n' и окно заканчивается, то машина

Сообщение drBatty »

promov писал(а):
17.01.2008 14:25
куда пропала управляющая последовательность '\n'


может её и не было?
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
promov
Сообщения: 384
Статус: Участник
ОС: Debian GNU/Linux

Re: Если в окне терминала встречается '\n' и окно заканчивается, то машина

Сообщение promov »

drBatty писал(а):
17.01.2008 16:17
может её и не было?
Ага, не было. Этот кусок программы в программе был именно как
1) объявление переменной
2) комментарий
3) объявление другой переменной
И объявление второй переменной было таковым, а не частью комментария, как Вы предположили. Есть что по существу сказать?
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Спасибо сказали:
Аватара пользователя
Skladnoy
Сообщения: 90
ОС: Debian

Re: Если в окне терминала встречается '\n' и окно заканчивается, то машина

Сообщение Skladnoy »

Код: Выделить всё

python -c 'print "a"*80; print "bb"'

Воспроизводит ту же ошибку? (80 можно заменить на ширину терминала) Тогда виноват терминал. Нет? тогда, вероятно, программа.

(promov) писал(а):Есть что по существу сказать?

(Skladnoy) писал(а):Тогда пиши баг-репорт, или чини/меняй терминал
Спасибо сказали:
promov
Сообщения: 384
Статус: Участник
ОС: Debian GNU/Linux

Re: Если в окне терминала встречается '\n' и окно заканчивается, то машина

Сообщение promov »

Skladnoy писал(а):
17.01.2008 16:36

Код: Выделить всё

python -c 'print "a"*80; print "bb"'

Воспроизводит ту же ошибку? (80 можно заменить на ширину терминала) Тогда виноват терминал. Нет? тогда, вероятно, программа.
Виноват, конечно, но... в общем, не изучил я ещё указатели, python скорее на название языка похоже- тоже для меня тёмный лес. Ну ладно, баг-репорт, значит баг-репорт (тоже, знаете ли... вот). Оcтановимся пока на этом. А пока вручную буду отслеживать, чтобы таких случаев не было. Спасибо, что откликнулись.
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Спасибо сказали:
Аватара пользователя
Liksys
Сообщения: 2910

Re: Если в окне терминала встречается '\n' и окно заканчивается, то машина

Сообщение Liksys »

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

PS: важен исходный текст или нет - решат тут.
Спасибо сказали:
promov
Сообщения: 384
Статус: Участник
ОС: Debian GNU/Linux

Re: Если в окне терминала встречается '\n' и окно заканчивается, то машина

Сообщение promov »

Подчиняюсь силе. Зато Ваше сообщение информативно донельзя. Оно очень много о Вас говорит. Поделился проблемой с единомышленниками, блин. Нет чтобы сразу выложить безобидный код из K&R. На будующее мне урок. А пока вот. Валяйте, ржите.

Код:

//Аналог программы 186.c Разница в том, что эта программа до кучи выводит входной поток. //Программа просматривает весь текст он начала идо конца, если находит ошибку в скобках, присваивает i значение 1. Если мы заходим в комментарии, то есть обнаруживаем последовательность // или /* то переменной p присваиваем одно из таких значений: /* Если нашли /* то p== * (соответственно, ищем *) если нашли /*а_через_некоторе_время_\ то p= \ (ищем любой знак кроме '\') eсли нашли /*_через_некоторое_время_*_не_/_и_не_'\' то p= * (ищем *) если нашли // то p= n (ищем '\n') если нашли //_через_некоторое_время_\ то p= | (ищем любой знак кроме '\') Кроме того, программа устроена так, что если комментарий начался /* то после каждой найденной пары \_любой_знак_кроме_'\' p присвоится значение *, то ест искать будем *. И если комментарий начался // то после каждой найденной пары \_любой_знак_кроме_'\' p присвоится значение 'n', то есть искать будем '\n' */ //Функции не использовал принципиально, хотя можно было. ТОгда сразу уж и рекурсию надо было- но это задание из K&R, а там рекурсия ещё не пройдена! Хотя стоп, может и не надо здесь функций никаких... Писанины будет ненамного (!) меньше зато сейчас программа последовательно выполняется и времени на её выполнение уходит вроде бы не больше, чем если бы я функции вызывал //Текст любой кроме <ctrl+d> #include <stdio.h> int main () { int c= 'k'; int f= 0, o= 0, k= 0; //Это количество скобок фигурных, обыкновенных и квадратных. int i= 0; char p= 'x';//Внимание! При просматривании всего текста эта штука равна x. Но она становится не равной x, как только мы заходим в комментарии char s= 'n';//А этой переменной мы присваиваем значение "последняя найденная скобка" c= getchar (); putchar ©; do { //Вот сюда заходим если находимся вне комментариев if (p== 'x') { if ((c!='(')&&(c!=')')&&(c!='{')&&(c!='}')&&(c!='[')&&(c!=']')&&(c!='"')&&(c!='\'')&&(c!='/')) { c= getchar (); if (c!= EOF) { putchar ©; } } else { if (c== '(') { s= c; o= o++; c= getchar (); if (c!= EOF) { putchar ©; } } if (c== '[') { s= c; k= k++; c= getchar (); if (c!= EOF) { putchar ©; } } if (c== '{') { s= c; f= f++; c= getchar (); if (c!= EOF) { putchar ©; } } //На одном примере разберём: если нами найдена обратная скобка и величина o (для каждого вида скобок своя) станет отрицательной, то это значит, что закрывающихся скобок больше, чем открывающихся, что ошибка. Если скобка, ближайшая к этой скобке и стоящая перед ней есть открывающаяся скобка другого вида, то это тоже ошибка, в том и другом случае i становится равным 1 if (c== ')') { if ((o= o-1)< 0||(s== '{')|| (s== '[')) { i= 1; } s= c; c= getchar (); if (c!= EOF) { putchar ©; } } if (c== '}') { if ((f= f-1)< 0||(s== '[')|| (s== '(')) { i= 1; } s= c; c= getchar (); if (c!= EOF) { putchar ©; } } if (c== ']') { if ((k= k-1)< 0||(s== '{')|| (s== '(')) { i= 1; } s= c; c= getchar (); if (c!= EOF) { putchar ©; } } //В этот цикл заходим, если найдём " if (c== '"') { //Считываем, до куда надо (см. условие) do { c= getchar (); if (c!= EOF) { putchar ©; } } while ((c!= '\\')&& (c!= EOF)&& (c!= '"')); //Если спокойно дошли до конца строковой константы, просто выходим из неё и всё. if (c== '"') { c= getchar (); if (c!= EOF) { putchar ©; } } else { if (c=='\\') { //ЕСли константа продолжается, считываем следующий знак и если он не '\' присваиваем с значение " и на начало. Теперь: каким бы ни был знак, стоящий после \ программа всё равно придёт на этот цикл, что нам и надо- надо ведь продолжать считывать знаки как строковую константу. Мы не можем присвоить переменной с, имеющей значение \ значение ", чтобы избежать такой ситуации: "..\" ТОгда программа пойдёт на начало придёт сюда и вторые кавычки будут трактоваться ею как окончание строковой костанты. c= getchar (); if (c!= EOF) { putchar ©; } if (c!= EOF) { c= '"'; } } } } //Объяснение один к одному, что и циклом выше, только там константа в двойных кавычках, а здесь в одинарных. if (c== '\'') { do { c= getchar (); if (c!= EOF) { putchar ©; } } while ((c!= '\\')&& (c!= '\')&& (c!= '\'')); if (c== '\'') { c= getchar (); if (c!= EOF) { putchar ©; } } else { if (c=='\\') { c= getchar (); if (c!= EOF) { putchar ©; } if (c!= EOF) { c= '\''; } } } } //Это значит, что начинается комментарий. if (c== '/') { c= getchar (); if (c!= EOF) { putchar ©; } if (c!= EOF) { if (c== '*') { //Это если мы нашли начало /* комментария. Сейчас выйдем из этого цикла, уйдём на начало, а оттуда будем искать его конец, т. е пойдём в то место, где p== '*' p= '*'; } else { if (c== '/') { //Это если мы нашли начало // комментария. Сейчас выйдем из этого цикла, уйдём на начало, а оттуда будем искать его конец, т. е пойдём в то место, где p== 'n' p= 'n'; } } } } //Как видно, если начался комментарий, то p стало равно * или / По выходу из этого цикла оно таким и осталось. Теперь на начало, а оттуда- в специальное место, где ищется конец комментария } } //Сюда заходим, если p!= 'x'. Это означает, что начались комментарии, мы в них зашли и теперь ищем их конец. else { //Cюда зашли, если нашли начало /* комментария if (p=='*') { //Просматриваем комментарий, пока не найдём, что ищем (см. условие) do { c= getchar (); if (c!= EOF) { putchar ©; } } while (c!= EOF && c!= '*'&& c!= '\\'); if (c!= EOF) { if (c== '*') { //Ага, нашли * Теперь будем искать / Соответственно p присваиваем значение / p= '/'; } else { //А это в комментарии мы нашли \ Теперь будем искать следующую '\' p== '\\'; } } } //А сюда мы зашли, если ищем / Её, напомню, ищем если осталось её найти и всё, комментарий закончился if (p== '/') { c= getchar (); if (c!= EOF) { putchar ©; } if (c!= EOF) { if (c== '/') { //Всё, если нашли / присваиваем p значение x и на начало p= 'x'; c= getchar (); if (c!= EOF) { putchar ©; } } else { //Это если /**\ Это если вдруг такой вариант попадётся. if (c== '\\') { p= '\\'; } else { //ЭТо если /**_не_*_и_не_'\'_и_не_\_и_не_/ if (c!= '*') { p= '*'; } //Остался вариант по умолчанию. То есть если с=='*' переменная p какой была / такой и осталась } } } } //А это значит, если комментарий начался /* а потом в нём встретилась \ Значит ищем следующую \ Переменной p присвоено соответствующее значение. На самом деле нам неважно, найдём мы её или нет. Важно, чтобы после первой \ стоял любой знак кроме '\'- она аннулирует всё. Поэтому, что бы после неё не стояло, мы после этого знака будем искать * if (p=='\\') { c= getchar (); if (c!= EOF) { putchar ©; } if (c!= EOF) { p= '*'; } } //Тут понятно, комментарий начался // Ищем '\n' if (p=='n') { //Считываем до определённого момента (см. условие) do { c= getchar (); if (c!= EOF) { putchar ©; } } while (c!= EOF && c!= '\\'&& c!= '\n'); if (c!= EOF) { //Это если мы спокойно считали '\n' Сейчас присвоим p значение x и пойдём на начало if (c== '\n') { p= 'x'; c= getchar (); if (c!= EOF) { putchar ©; } } //А это тот случай, когда в теле комментария, начавшегося // (не /* !) была обнаружена \ Значит, нужно искать знак, который за ней следует else { p= '|'; } } } //Сюда зашли если комментарий начался// а потом прервался '\' if (p== '|') { c= getchar (); if (c!= EOF) { putchar ©; } //Вот, какой бы знак сейчас ни был (кроме '\') будем искать '\n' if (c!= EOF) { p= 'n'; } } } } while (c!= EOF); if(f> 0|| o> 0|| k> 0) { i= 1; } if (i== 1) { printf ("Есть ошибки\n"); } else { printf ("Ошибок нет\n"); } return 0; }


Ликсус бы так никогда не поступил.
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Спасибо сказали:
Аватара пользователя
Liksys
Сообщения: 2910

Re: Если в окне терминала встречается '\n' и окно заканчивается, то машина

Сообщение Liksys »

promov, сразу бы так. Никто над тобой смеяться не будет, все когда-то начинающими были. Кто посмеет ржать - прибью. А теперь попробуй вот что - сделай соединение по каналу. То есть скажем твоя прога называется test, тогда:

Код: Выделить всё

cat you_file | ./test
. И посмотри, что будет.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Если в окне терминала встречается '\n' и окно заканчивается, то машина

Сообщение drBatty »

promov, слишком много букв. Но вот это исправьте:

Код: Выделить всё

                    f= f++;// и все такие строчки.


                    else {
//А это в комментарии мы нашли \ Теперь будем искать следующую '\'
                        p== '\\';//может p='\\'???
                    }
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Если в окне терминала встречается '\n' и окно заканчивается, то машина

Сообщение sash-kan »

и чего навалились на парня?
действительно, если в тексте в окне терминала строка заканчивается впритык к границе, то иногда (системы не выяснил, не интересовало) при выделении-вставке (в другое окно) мышкой теряется \n, и следующая строка «слепеляется» с такой «пограничной».
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
Folderx
Сообщения: 296
ОС: fedora, mandriva

Re: Если в окне терминала встречается '\n' и окно заканчивается, то машина

Сообщение Folderx »

(promov) писал(а):Фолдрекс! На твою помощь не надеюсь, ибо ты ещё меньше моего шаришь в этом деле, советуя в комментарий вставить printf (эта первая причина аппелировать к начальству).

Я не советовал в комментарий вставить printf, ты ошибся.

(promov) писал(а):Но дабы избежать упрёков типа: "Тебе помочь хотят, а ты отнекиваешься" по новой объясняю суть проблемы.

Не, упрёков не будет, ты не хочешь выкладывать свой код, но тебе придётся это делать. Ты тратишь чужое время скрывая его. ;)

Кто тебе что тут должен ?

(promov) писал(а):А третья будет, когда ты запросишь исходник программы, которую я упомянул в самом начале и которая вообще не нужна здесь.

В самом деле, не тебе решать что здесь нужно а что не нужно, а окружающим. Которым, кстати, ты задаёшь вопросы.

(promov) писал(а):Подчиняюсь силе. Зато Ваше сообщение информативно донельзя.

Информативно его сообщение.

Тебе тут никто ничего не должен promov. ;)
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Если в окне терминала встречается '\n' и окно заканчивается, то машина

Сообщение drBatty »

sash-kan писал(а):
17.01.2008 23:12
действительно, если в тексте в окне терминала строка заканчивается впритык к границе, то иногда (системы не выяснил, не интересовало) при выделении-вставке (в другое окно) мышкой теряется \n, и следующая строка «слепеляется» с такой «пограничной».


Да в правду. Я наблюдал такой глюк у себя в системе.

promov, скомпилируйте свои программы с ключём -Wall и внимательно читайте предупреждения.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали: