C拼图:你将如何在控制台上打印一些东西?

时间:2010-08-20 11:31:55

标签: c puzzle

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

在接受采访时被问及。

我被告知要在控制台上打印一些东西。

10 个答案:

答案 0 :(得分:20)

真的很惊讶没人发布这个:

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

在运行时打印,没有任何未定义的行为。

答案 1 :(得分:19)

奇怪的问题......

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*/

答案 2 :(得分:5)

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

主要

答案 3 :(得分:3)

一种实现定义方式是在编译期间使用pragma指令进行打印。

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

或者,您可以在运行时使用某些宏和printf(但不是在某些方面或其他方面不引入UB)来执行此操作。

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

答案 4 :(得分:0)

#include <stdio.h>

#pragma message("Some foobar")

#error This is an error message

int main()

{

exit(0);

}

我认为面试官想知道你是否知道#error指令......只需要2美分。

答案 5 :(得分:0)

如果找不到编辑该文件的变通方法,请使用其他c文件。

答案 6 :(得分:0)

大多数答案都涉及#define c-preprocessor指令来改变程序的含义。大多数编译器也支持

之类的东西
#pragma startup foo()

详细信息取决于编译器供应商。您可以在以这种方式调用main(*)之前运行代码。

答案 7 :(得分:0)

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

答案 8 :(得分:0)

解决方案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将不同的函数用作main或在main之前运行启动代码。

解决方案3

如果您的编译器支持除C之外的任何C ++功能,那么答案很多:

  • 使用构造函数和该类型的静态变量声明一个类
  • 将现有的“main”函数放入单独的命名空间(或类定义)并编写不同的全局主要

解决方案4

我还寻找任何强制运行时错误的方法(堆栈溢出,内存不足,空引用,tc),这通常会导致程序打印一些东西,但找不到任何方法涉及运行额外的代码,在这种情况下额外的代码也可能是printf。

答案 9 :(得分:0)

如果您将此问题解释为意味着您不能或不允许通过在该部分的上方和下方分别注释/* */或使用#ifdef _COMMENT_ME_OUT__ #endif来编辑该文件,则不允许您进行编辑,然后介绍一个新的主要,然后你应该给出另一个.c文件的答案。