C головоломка: как вы напечатаете что-то на консоли?

/*you cannot change anything from here below*/
main()
{
exit(0);
}
/*you cannot change anything from here up*/

Это было задано во время интервью.

Мне сказали что-то напечатать на консоли.

кто-нибудь?

Ответ 1

Одним из способов, определяемых реализацией, было бы использование директив pragma для печати во время компиляции.

#pragma message "Compiling " __FILE__ "..."

Или вы можете сделать это с некоторыми макросами и printf (но не без представления UB в том или ином аспекте) во время выполнения.

#define exit(x) printf("Hello, world!")
int main() {
 exit(0); 
 return 0; /* if pre-C99 */
}

Ответ 2

Действительно удивился, что никто еще не опубликовал это сообщение:

#include <stdio.h>

#if 0

/*you cannot change anything from here below*/
main()
{
exit(0);
}
/*you cannot change anything from here up*/

#endif

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

Печать во время выполнения и без undefined поведения.

Ответ 3

странный вопрос...

int main(void)
{
    printf("hello");
    return 0;
}
#define main int lol
/*you cannot change anything from here below*/
main()
{
exit(0);
}
/*you cannot change anything from here up*/

Ответ 4

#include <stdio.h>
#define exit(c) return puts("foobar"),0

по основному

Ответ 5

#include <stdio.h>

#pragma message("Some foobar")

#error This is an error message

int main()

{

exit(0);

}

Я думаю, что интервьюер хотел узнать, знаете ли вы о директиве #error... только мои 2 цента.

Ответ 6

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

Ответ 7

В большинстве ответов используется команда #define c-preprocessor для изменения того, что означает программа. Большинство компиляторов также поддерживают что-то вроде

#pragma startup foo()
Детали

зависят от поставщика компилятора. Вы можете выполнить код, прежде чем main (*) будет вызван таким образом.

Ответ 8

#define exit(x) (printf("Bye"))
int main(int argc,char* argv)
{
    exit(0);
    getchar();
    return 0;
}

Ответ 9

Решение 1.

Это работает без каких-либо препроцессорных директив в cl и gcc, хотя я не тестировал, чтобы убедиться, что я не использую никаких расширений:

#include <stdio.h>
static void exit() {
   printf("Hello world");
}
/*you cannot change anything from here below*/
main()
{
exit(0);
}
/*you cannot change anything from here up*/

Я думаю, что это действительно, но я не могу вспомнить, разрешено ли маскирование стандартной библиотечной функции или нет.

Решение 2

Как уже указывалось несколько других ответов, вы можете использовать директивы препроцессора, например:

  • #define main или выйти, чтобы быть тем, что вызывает ifdef
  • используйте #if 0 для предотвращения компиляции существующего кода.
  • с помощью #pragma message или #error для печати сообщения во время компиляции
  • используя #pragma startup, чтобы использовать другую функцию как основную или запускать код запуска до основного.

Решение 3

Если ваш компилятор поддерживает любые С++-функции в дополнение к C, есть много ответов:

  • Объявить класс с конструктором и статической переменной этого типа
  • Поместите существующую "основную" функцию в отдельное пространство имен (или определение класса) и напишите другой глобальный основной

Решение 4

Я также искал любой способ принудительной ошибки во время выполнения (переполнение стека, из памяти, нулевое разыменование, tc), что обычно заставляло программу печатать что-то, но не могло найти никакого способа, t задействовать дополнительный код, и в этом случае дополнительный код может также быть printf.

Ответ 10

Если вы интерпретировали вопрос как означающий, что вы не можете или не можете редактировать файл, комментируя /* */ или используя #ifdef _COMMENT_ME_OUT__ #endif соответственно выше и ниже раздела, который вам не разрешено редактировать, а затем вводите новую главную страницу, то вы должен дать ответ об использовании другого файла .c.