2014-09-01 4 views
2

Просто примечание, есть еще один вопрос о стеке, подобный моему, но этот вопрос на самом деле задает два вопроса. Один из вопросов не связан с моим вопросом, и это единственный вопрос.Формулировка упражнения 5.1 в K & R c

Я также спрашиваю другой вопрос. Его можно найти ниже: Что я должен делать с нулем, хранящимся в массиве через указатель?


упражнение дает мне функцию, int getint(int *), которая принимает адрес элемента массива, преобразует ASCII цифр из входного потока, а затем сохраняет их в виде десятичного числа в указателе Int. Он возвращает EOF для конца файла, ноль, если следующий вход не является числом, и положительное значение, если вход содержит допустимое число. Функция содержит функцию ungetch(), которая возвращает символ обратно на входной поток.

Я не понимаю формулировку следующего упражнения:

как написано, GetInt лечит + или - не следуют цифры в качестве действительного представления нуля. Закрепите его, чтобы набрать такой символ на вход

Является ли это высказыванием, что я должен нажать + или - обратно на входной поток или нажать символ, который не был числом, на входной поток? Кроме того, как я должен обрабатывать нуль, хранящийся в массиве, через указатель?

Вот код:

int getint(int *pn) 
{ 
    int c, sign; 

    while (isspace(c = getch())) 
     ; 
    if (!isdigit(c) && c != EOF && c != '+' && c != '-'){ 
     ungetch(c); 
     return 0; 
    } 
    sign = (c == '-') ? -1 : 1; 
    if (c == '+' || c == '-') 
     c = getch(); 
    for (*pn = 0; isdigit(c); c = getch()) 
     *pn = 10 * *pn + (c - '0'); 
    *pn *= sign; 
    if (c != EOF) 
     ungetch(c); 
    return c; 
} 
+1

Проблема с K & R заключается в том, что рекомендуется писать код, как указано выше , –

+0

Что в этом плохого? Что бы вы сделали? Я просто использую книгу для изучения кода и языка. – Spellbinder2050

+0

Проблема в том, что эта книга невероятно устарела, язык и ее использование (с точки зрения передового опыта и т. Д.) Сильно изменились с момента написания. Я настоятельно рекомендую учиться у одной из книг «Beginner», перечисленных здесь: http://stackoverflow.com/a/562377/129570 –

ответ

2

упражнение просит вас признать, что есть тонкая ошибка в программе , когда вы столкнулись с «+» или «-», но то, что следует не число ,

Например,

+<EOF> 
+apple 
-banana 

В отличие от действительных чисел, как

+1 
-17 

В текущей программе, если вы видите, первый случай в потоке данных, вы потребляя «+ 'и' - ', а затем сообщая пользователю, что вы видели номер в потоке, и это число было 0. Но это совсем не так!

Является ли это высказыванием, что я должен нажать + или - обратно на входной поток или нажать символ, который не был числом, на входной поток?

Подумайте, что вы ожидаете от потребителя этой функции. Например, давайте напишем , что сотрудник предоставил вам эту функцию, и вам пришлось использовать ее. Что бы вы сделали ? Есть действительно 2 варианта:

  1. Потребляйте «+» или «-» из потока данных и отбрасывайте его. Сообщите вызывающему абоненту с возвращаемым значением, которое вы не видите.

  2. Поместите «+» или «-» обратно в поток данных.Сообщите вызывающему, что вы сделали , чтобы не увидеть номер.

Скорее всего, вы хотите функцию не отбрасывать данные, которые он не использования. Что делать, если вы прошли строку в функции с этим текстом:

++var; 

это нормально потреблять «+» и просто оставить +var;? Я так не думаю.

Чтобы ответить на ваш вопрос напрямую, нажмите «+» или «-» обратно в поток. Убедитесь, что вы положили все символов обратно в поток, который вы достали. Возвратитесь к пользователю, код, который указывает, что следует в потоке, не является номером .

Также, как я должен обрабатывать нуль, хранящийся в массиве, через указатель?

У вас нет! Если вы не видите номер, почему вы говорите вызывающему, что вы видели номер 0? Измените код так, чтобы вы не задавали '0' в массиве, если вы не видели числа.

(Это один немного более неоднозначным. Вы можете документировать функции такой, что абонент должен относиться к pn как мусор, если вы вернулись EOF или 0. Тогда можно написать все, что вы хотели pn до тех пор, как вы просто вернулись 0 Но это хорошее упражнение, чтобы выяснить, как изменить функцию таким образом, чтобы вы не касались pn вообще, если вам не нужно.)

Смежные вопросы