2016-09-28 4 views
0

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

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

Я довольно новичок в C и выполнил упражнение удобно, в указанной среде, но я никогда раньше не строил библиотеку. Поскольку мои методы будут вызваны из другой программы, как я должен работать с неправильным вводом пользователя?

Мне позволено задавать вопросы и я просил об этом явно говорить, но получил ответ, что кандидат может решить, как бороться с ошибками.

Я прочитал некоторые вещи об использовании errno, некоторые хорошие, некоторые плохие. Стандартно ли сообщать об ошибках с помощью этого макроса?

Я начинаю думать о вещах, таких как переносимость, но часть задания - использовать определенную версию Linux и использовать компилятор gcc. Я думаю, что до тех пор, пока я сделаю разумную попытку сделать свое решение портативным, со мной все будет в порядке.

Есть ли другие вещи, которые новый блог пытается написать в библиотеке?

+0

Использование 'errno' имеет проблемы; это означает, что вы не можете сообщать о ошибках, которые еще не являются стандартными системными ошибками. Часто их достаточно, но если вы компилируете регулярные выражения, например, ошибки, доступные из '', в большинстве случаев не подходят для возможных ошибок регулярных выражений - сообщение «EINVAL» за все, что не так, не очень полезно. Также обратите внимание, что никакая стандартная функция библиотеки ни в стандартном C, ни в стандартном POSIX никогда не устанавливает «errno» в ноль. Вы должны быть осторожны, если вы сделаете это в своем коде: 'int old_errno = errno; errno = 0; …ваш код…; if (errno == 0) errno = old_errno; 'ОК. –

+0

C не поддерживает _methods_, только _functions_ – Olaf

+0

Джонатан Леффлер - это все, что я не должен делать. Можете ли вы сказать мне разумный подход к обработке пользовательского ввода? Давайте используем пример библиотеки, принимающей только заглавные буквы. Пользователь дает строчную букву или буквы. Что такое стандартный метод борьбы с плохим вводом? – AspiringCodeMonkey

ответ

-1

errno - наиболее полезный метод в стандартной библиотеке для сообщений об ошибках. string.h также определяет полезную функцию, называемую strerror, которая преобразует код ошибки в строку. Вот примерная функция, которую вы можете использовать для сообщения об ошибках.

#include <errno.h> 
#include <string.h> 

void error_quit(char *message) 
{ 
    int errcode = errno; 
    fprintf(stderr,"Error at %s: %s\n",message,strerror(errcode)); 
    exit(EXIT_FAILURE); 
} 

Вызов этой настройки message к тому, что отчеты об ошибках сообщение, которое вы хотите. Например, если вы хотите проверить, если read не удается (полезно для проверки ввода данных пользователем):

int n = read(fd,buf,sizeof(buf)); 
if (n <= 0) 
    error_quit("read"); 

Это даст пользователю описательную информацию о том, почему read не удалось. Будут отображаться любые проблемы с пользовательским вводом.

Существует также полезный макрос для Windows.

#define PERR(bSuccess, api) {if(!(bSuccess)) printf("%s: Error %d from %s on line %d\n", __FILE__, (int) GetLastError(), api, (int) __LINE__);} 
+0

Мне нравится, как ваша реализация не меняет errno. Однако я не уверен, что могу использовать это. Все мои методы просто преобразуют строки в другие типы данных, делают с ними что-то, а затем возвращают их пользователю. Я думаю, может быть, я уже думал об этом. Возможно, я должен просто хорошо документировать свою библиотеку и дать пользователю обратно их ошибочный ввод и короткое сообщение о том, почему это плохо. – AspiringCodeMonkey

+0

Написание функции, аналогичной приведенной выше, наглядно показывает вам интервьюеры, что вы не знаете 'perror' существует. Это также указывает, что вы не знаете, как правильно назвать свои функции. Функция, которая называется «... quit» и не имеет неправильного имени. – tofro

+0

Этот код не будет работать с многопотоком. Просто нет синхронизации между потоками, а 'errno' - локальной. И поток вывода ошибки - 'stderr'. – Olaf

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