LINUX.ORG.RU

что я не так понял ?


0

0

почему после выполнения програмы не выполняется команда ls ? насколько я понимаю сбрасывается stdin , тогда как сделать чтоб не сбрасывался ? и ещё вопрос как можно реализовать что-то на подобии того что происходит при надатии на среднюю кнопку мыши , т.е. появлялся текст в активном окне ?

#include <stdio.h>

int main (int argc, char *argv[]) { char command[] = "ls\n"; int i,status; for(i = 0; i < strlen(command); i++ ) { ungetc(*(command + i), stdin); } }

anonymous

> что я не так понял ?

Я Вам завидую...
Вы хоть "не так", но что-то поняли.
Я же понять, как весь этот бред, который Вы написали _по Вашему мнению_ должен был работать, вообще не смог.
При "нажатии на среднюю кнопку мыши" вызывается системная функция 3 ioctl TIOCLINUX, а никак не мифический "ungetc".
Рекомендую почитать на сон грядущий /usr/src/linux/include/linux/tiocl.h

anonymous
()

Лучше бы объяснил почему ls должна выполнятся... Для выполнения программ есть функции exec, system, popen и т.д. ungetc к выполнению программ никакого отношения не имеет. Чтобы понять, почитай man на каждую из перечисленных функций, и на ungetc то же.

p.s. Никогда не вызывай strlen в условии проверки граничного значения цикла.

anonymous
()

ungetc ничего не добавляет в терминальный буфер - он лишь добавляет в буфер stdio текущего процесса, так что свои данные ты сможешь получить только из своего процесса и только функциями stdio.

Murr ★★
()
Ответ на: комментарий от anonymous

strlen

> тогда как проверять конец строки ?

Последний символ: '\0';

А если уж вызывать strlen, то можно сделать это до начала цикла и записать значение в переменную, которую потом сравнивать с индексом.

DKorolkov
()
Ответ на: Кстати о streln в проверке увловия цикла/+ от hapchu

> Вот здесь можно почитать, будет понятно почему это не надо делать

Довольно интересно. С Паскалем и, соответственно, с паскалевскими строками я имел дело, могу только согласиться с изложением их достоинств и недостатков. Можно описывать строки и по другому: парой указателей -- один указывает на первый символ строки, другой на следующий после последнего (т.е. за границей строки). Тогда длина строки равна разности указателей.

----------------------------

Корольков Дмитрий

http://dkorolkov.by.ru

DKorolkov
()
Ответ на: комментарий от DKorolkov

Если писать на C++, то во многих (но не во всех) случаях лучше использовать std::string. Там маразма с нулевым байтом нет, да и память выделяется поумнее. Но при использовании std::string всегда надо думать дважды чтобы избежать лишних копирований строк.

anonymous
()
Ответ на: комментарий от anonymous

вообще-то std::string как-раз используют технику отложенного копирования --- копируется только при изменении... или речь про то и идет что мол запишем ноль посередине и скормим куда-нить? тогда да.

anonymous
()
Ответ на: комментарий от anonymous

> вообще-то std::string как-раз используют технику отложенного копирования

В какой реализации? У std::string кроме собственно ссылки на данные (для которой эта техника действительно используется) до попы других данных, которые копируются энергично.

anonymous
()
Ответ на: комментарий от anonymous

Для данных используется reference counters по крайней мере в gcc. Лишнего вызова конструктора независимо от этого лучше избегать.

anonymous
()
Ответ на: комментарий от anonymous

Да, точно, только что проверил. Раньше было хуже.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.