2013-02-10 3 views
0

Можно ли написать программу «hello world» в C без использования функции printf? (В то же время сохраняя программу относительно в несколько строк)«Привет мир» в C без printf?

+4

Вы всегда можете использовать puts, fwrite и т. Д. – nhahtdh

+2

'write (1,« hello world », 11);' – technosaurus

+0

@technosaurus: Это не часть стандарта C, но может быть частью другого стандарта ... – nhahtdh

ответ

5

Это должно работать:

int main (void) 
{ 
    puts("Hello, World!"); 
    return 0; 
} 

Почему вы не хотите использовать Printf? Я не могу думать ни о какой причине.

+0

Не то, чтобы я «Не хочу использовать его, это был вопрос« возможно ли это », потому что я новичок в C. – user1869465

+4

На самом деле, если ваш прецедент - это просто нормальная строка с линией перевода в конце, она делает больше смысл _not_ использовать 'printf'. 'puts' почти наверняка более эффективен, так как ему не нужно беспокоиться о форматировании символов. +1, как только «главная» была изменена на одну из канонических форм :-) – paxdiablo

+4

@paxdiablo Я видел GCC-оптимизацию 'printf (« строковый литерал »);' в 'puts (« строковый литерал »);'. Я обнаружил это, потому что это нарушило мою попытку захватить 'printf()', используя динамическую библиотечную инъекцию: O – 2013-02-10 06:35:28

3
write(stdout, "hello world", strlen("hello world")); 
+1

Err, 'stdout' - это _stream, _ не файловый дескриптор. Возможно, вы имели в виду 'fwrite'? Тем более, что в C нет «писать». – paxdiablo

+2

Hrm, справа. Измените stdout на номер 1. Thx. – PQuinn

+1

или 2 для записи в stderr, а также включить unistd.h для записи и string.h для strlen (или просто поместить целочисленное значение, так как это постоянная строка) – technosaurus

2

Это смешно альтернатива просто использовать puts("hello world\n");

#include <stdio.h> 
int main(void){ 
    char *s="hello world\n"; 
    while (*s) putchar(*s++); 
} 
2

Ну, если мы будем включать глупые примеры (да, я смотрю на вас, technosauraus), я бы идти с:

#include <stdio.h> 

void makeItSo (char *str) { 
    if (*str == '\0') return; 
    makeItSo (str + 1); 
    putchar (*str); 
} 

int main (void) { 
    makeItSo ("\ndlrow olleH"); 
    return 0; 
} 

Только не делайте это на самом деле длинные строки или выяснить, что переполнение стека действительно означает :-)

+0

+1 для дополнительной глупости, так как реверсирование струны не требовалось. :) –

Смежные вопросы