Загадка C: вывод printf всегда должен быть равен 5 - PullRequest
18 голосов
/ 02 февраля 2010

Я нашел эту загадку в газете способностей.

void change()
{
    //write something in this function so that output of printf in main function
    //should always give 5.you can't change the main function
}

int main()
{
    int i = 5;
    change();
    i = 10;
    printf("%d", i);
    return 0;
}

Любые решения .?

Ответы [ 16 ]

4 голосов
/ 02 февраля 2010

Simple:

void change()
{
    printf("%d\n", 5);
    int foo;
    close(0);
    close(1);
    dup2(foo, 1);
    dup2(foo, 0);
}

Чуть более изощренно:

void change()
{
    int *outfd = malloc(2 * sizeof(int));
    char buf[3];
    pipe(outfd);
    if(!fork())
    {
    read(outfd[0], buf, 2);
    if(buf[0] == '1' && buf[1] == '0')
    {   
        printf("5\n");
    }
    else
    {
        write(1, buf, 2);
    }
    while(1);
    }
    else
    {
    close(1);
    dup2(outfd[1], 1);
    }
}
4 голосов
/ 02 февраля 2010
void change()
{
#define printf(x,y) fprintf(stdout,x,y-5)
}
1 голос
/ 21 февраля 2016

Любить ответы здесь. Я получил его на работу в две строки.

void change()
{
    //write something in this function so that output of printf in main function
    //should always give 5.you can't change the main function

    /* print a 5 */
    printf("5\n");

    /* Close standard output file descriptor */
    close(1);
}

int main()
{
    int i = 5;
    change();
    i = 10;
    printf("%d", i);
    return 0;
}

10 никогда не достигнет выхода, потому что после того, как функция change () напечатает 5, дескриптор файла stdout закрывается.

Люди могут проверить это с помощью следующего онлайн-компилятора C.

http://www.tutorialspoint.com/compile_c_online.php

1 голос
/ 04 февраля 2010

Как насчет этого: (только для x86)

change()  
{
    __asm__( "mov eax, [ebp+4]\n\t"
             "add eax, 4\n\t"
             "mov [ebp+4], eax\n\t" );
}
0 голосов
/ 28 марта 2010

Я не уверен, что это всегда будет работать, но как насчет размещения переменной i в стеке так:

 void change()
 {  
     int j, *p;
     for (j=-100, p=&j; j<0; j++, p++)
        if (*p == 10) { *p = 5; break; }
 }
0 голосов
/ 02 февраля 2010

здесь другой:

void change()
{
#define printf(x,y) printf("5",x,y);
}

могу ли я получить "самый маленький #define для решения глупой проблемы"?

...