Что заменить в этой загадке C? - PullRequest
1 голос
/ 26 января 2010

Теперь это глупая головоломка, которую я получил из экзаменационной работы, к сожалению, я не могу понять это за последние 15 минут.

#include <stdio.h>

int main(void){

    /* <something> */    

      putchar(*(wer[1]+1));
   return 0;
 }

Что мы должны заменить вместо чего-то, чтобы получить вывод e. Теперь мы знаем, что putchar принимает int в качестве аргумента, но этот код предполагает указатель. Является ли этот вопрос правильным?

Ответы [ 6 ]

13 голосов
/ 26 января 2010
const char *wer[2] = { "failed", "test" };
8 голосов
/ 26 января 2010

Поскольку a[i] по определению совпадает с *(a + i), вы можете преобразовать аргумент putchar() в wer[1][1]. Итак, что-то вроде char *wer[2] будет удовлетворительным определением, и любые значения, такие что wer[1][1] == 'e' будут работать.

3 голосов
/ 26 января 2010
char * wer[] = { "foobar", "he"};
0 голосов
/ 10 марта 2010

Простой ответ:

   char **wer;
   putchar('e');
   return 0;

Например, полный код должен выглядеть так:

#include <stdio.h>

int main(int argc, char **argv)
{
    /* Something starts here */
    char **wer;
    putchar('e');
    return 0;
    /* Something ends here */

    putchar(*(wer[1] + 1));
    return 0;
}

Вывод:

susam@swift:~$ gcc really-silly-puzzle.c && ./a.out && echo
e
susam@swift:~$

Более интересный вопрос был бы: какой самый короткий код может заменить / * * /, чтобы получить вывод 'e'?

0 голосов
/ 26 января 2010

С очень педантичной точки зрения, нет правильного ответа на вопрос.Вопрос недействителен.Сам язык Си не дает никаких гарантий относительно вывода программы, если вывод не заканчивается символом новой строки.См. 7.19.2 / 2

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

Эта программа выводит на стандартный вывод, который является текстовым потоком.Вывод этой программы зависит от реализации, независимо от того, что вы поставили вместо /* <something> */, что означает, что вопрос может иметь смысл для какой-то конкретной платформы, но он не имеет смысла в качестве абстрактного вопроса на языке C.1009 * Я очень сомневаюсь, что ваши экзаменаторы ждут от вас такого рода педантизма:)))

0 голосов
/ 26 января 2010

Во-первых, в коде вы упомянули аргумент для putchar ():

   *(wer[1]+1)

, который не является указателем. Кажется, что wer [1] является некоторым указателем, а адрес, на который указывает wer [1] + 1, разыменовывается. Так что, если wer является массивом указателей на int, тогда аргумент putchar должен быть int, что нормально.

Теперь код вместо чего-то может быть Вы не упомянули четко, что это означает, является ли символ символом или e равен 2,71 ... (Основа натурального логарифма) В любом случае получить этот вывод с этим кодом будет легко.

-AD

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...