#include <dos.h>
typedef unsigned char uchar;
#define BUFSIZE 32
uchar str_buf[BUFSIZE];
uchar far *s_hint_in = "\r\nВведите строку: $";
uchar far *s_hint_out = "\r\nВы ввели: $";
uchar far *s_empty = "...а ничего не ввели!$";
uchar far *s_eol = "\r\n$";
uchar far *s_bell = "\x7$";
uchar far *s_bs = "\x8 \x8$";
uchar far *s_delrc = " \x8$";
uchar far *s_space = " $";
uchar dos_charin()
{
_AH=0x01;
geninterrupt(0x21);
return (uchar)_AL;
}
void dos_strout(uchar far *buf)
{
_AH=0x09;
_DS=FP_SEG(buf);
_DX=FP_OFF(buf);
geninterrupt(0x21);
}
int dos_strin(uchar *buf, int buf_size)
{
uchar sym=0;
int charcount=0;
do {
sym=dos_charin();
if(sym==8)
{
if(charcount>0) {dos_strout(s_delrc);charcount--;continue;}
else {dos_strout(s_space);continue;}
}
if(sym==0){continue;}
if((charcount==(buf_size-1))&&(sym!=(uchar)'$'))
{dos_strout(s_bell);dos_strout(s_bs);continue;}
buf[charcount++]=sym;
} while(sym!=(uchar)'$');
dos_strout(s_bs);
return --charcount;
}
int main()
{
unsigned int entered_chars=0;
dos_strout(s_hint_in);
entered_chars=dos_strin(str_buf, BUFSIZE);
dos_strout(s_eol);
dos_strout(s_hint_out);
if(entered_chars>0)
{dos_strout((uchar far*)str_buf);}
else
{dos_strout(s_empty);}
dos_strout(s_eol);
return 0;
}
Прерывания, ввод текст до ввода символа $
Задание такое: С помощью прерываний ввести строку символов, которая будет показываться, пока не введем $.
Проделать с Эхо, и без.
Когда текст вбит в саму программу, то это конечно легко.. Но текст надо вводить с клавиатуры.. Я уже циклами себе мозги расплавил..
Обязательное условие: использование лишь библиотеки dos.h
Заранее благодарю.
введенная строка выведется после ввода символа $?
Строка отображается и программа прерывается после ввода $.
Сейчас до меня доходит, что если в программе будет $, то просто маяком можно перейти в конец программы..
А эхо как я понял должен дважды выводить символ на экран через _AH=2.
Хотя в прерываниях я не силён, программирование не моя специальность.
Дали нам один пример:
{ char far *ss="qwerty$";
_AH=9;
_DS=FP_SEG(ss);
_DX=FP_OFF(ss);
geninterrupt(0x21);
}
Принцип работы этих команд даже не объяснено, вычитывайте сами, разбирайтесь и пишите программу. По-этому набросал много, а толку нет.
в ah - номер функции. 09 - вывод на экран.
в ds - адрес сегмента данных, где размещаются все строки.
в dx - адрес самой строки.
geninterrupt(0x21) - вызов 21го прерывания.
строки, выводимые таким образом должны заканчиваться знаком '$', он не выводится. подробнее можно прочесть тут
Вот рабочий вариант! ;)