Как вы будете печатать любой символ, строку или значение переменной без библиотечных функций в C? - PullRequest
8 голосов
/ 22 января 2009

Если, например, мне не следует использовать стандартные библиотечные функции, такие как printf, putchar, то как мне легко вывести символ на экран? Есть ли простой способ сделать это? Я не знаю много о системных вызовах, и если я должен их использовать, то как?

Так может ли кто-нибудь посоветовать простой способ печати без использования библиотечных функций?

Ответы [ 3 ]

15 голосов
/ 22 января 2009

В стандартном С вы не можете. Единственный ввод / вывод, определенный в C, осуществляется через стандартные функции библиотеки C.

На данной платформе могут быть способы сделать это:

  • Делать вызовы ядра напрямую. Для этого вам, вероятно, потребуется написать несколько встроенных сборок. Вы можете сделать write вызов Litb напрямую, без использования вашей библиотеки C. Возьмите источник вашей библиотеки C, чтобы увидеть, как это делается.
  • Запись непосредственно в буфер кадра. Многопользовательские ОС часто запрещают это (по крайней мере, без каких-либо вызовов библиотеки / ядра).

Если вы не пишете свою собственную библиотеку C, я не уверен, почему вы захотите это сделать.

6 голосов
/ 22 января 2009

В Linux вы можете использовать системный вызов write:

write(1, "hello\n", 6); // write hello\n to stdout

Если вам не хватает этого, вы можете пойти на один шаг ниже, вызывая системный вызов в общем случае:

syscall(__NR_write, 1, "hello\n", 6);

Стоит знать о strace, который вы можете использовать, чтобы увидеть, какие системные вызовы используются какой-либо конкретной программой во время ее работы. Но обратите внимание, что для «некоторого простого парсера» вряд ли нужно использовать необработанные системные вызовы. Лучше использовать функции библиотеки c.

Кстати, обратите внимание на функции WriteFile и GetStdHandle, если вы хотите сделать это в Windows без использования стандартной библиотеки c. Хотя это будет не так много, как решение для Linux.

4 голосов
/ 22 января 2009

Ну, спасибо вам всем за ваши ответы. Я нашел один простой ответ в виде комментария от г-на Хао ниже вопроса. его ответ проста программа вроде этой

Turbo C (программа DOS):

char far* src = (char far*) 0xB8000000L; 
*src = 'M'; 
src += 2; 
*src = 'D'; 

или попробуйте это: http://en.wikipedia.org/wiki/Brainfuck :) - // Хао (час назад)

Я попробовал это на Turbo C и он работает. Я хотел простое решение, подобное этому, и я хотел принять его как правильный ответ, но он (Хао) дал его как комментарий, поэтому я вставил его сюда, чтобы другие пользователи могли узнать об этом от его имени, и принял его. Еще раз спасибо мистер Хао.

...