Загадка C: как вы будете печатать что-то на консоли? - PullRequest
10 голосов
/ 20 августа 2010
/*you cannot change anything from here below*/
main()
{
exit(0);
}
/*you cannot change anything from here up*/

Об этом спрашивали во время интервью.

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

кто-нибудь? * * 1006

Ответы [ 10 ]

20 голосов
/ 20 августа 2010

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

#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;
}

Печать во время выполнения и никакого неопределенного поведения вообще.

19 голосов
/ 20 августа 2010

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

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*/
5 голосов
/ 20 августа 2010
#include <stdio.h>
#define exit(c) return puts("foobar"),0

над основной

3 голосов
/ 20 августа 2010

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

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

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

#define exit(x) printf("Hello, world!")
int main() {
 exit(0); 
 return 0; /* if pre-C99 */
}
0 голосов
/ 17 июля 2012

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

0 голосов
/ 31 мая 2011

Решение 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 или exit для вызова ifdef
  • используйте #if 0 для предотвращения компиляции существующего кода
  • с использованием #pragma message или #error для печати сообщения во время компиляции
  • с использованием #pragma startup для использования другой функции в качестве основного или для запуска кода запуска перед основным.

Раствор 3

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

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

Решение 4

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

0 голосов
/ 21 августа 2010
#define exit(x) (printf("Bye"))
int main(int argc,char* argv)
{
    exit(0);
    getchar();
    return 0;
}
0 голосов
/ 20 августа 2010

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

#pragma startup foo()

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

0 голосов
/ 20 августа 2010

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

0 голосов
/ 20 августа 2010
#include <stdio.h>

#pragma message("Some foobar")

#error This is an error message

int main()

{

exit(0);

}

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

...