概述
今天介绍两个函数用以代替库函数atoi()、atol()和strtol()函数,原因是它能提供比库函数更好的错误检查机制。
int getInt(const char *arg, int flags, const char *name);
long getLong(const char *arg, int flags, const char *name);
arg指向待转的数字字符串,flags有固定的几个宏值,代表待转换数字字符串的进制情况,name指向待转字符的说明字符串,用于发生错误时添加到错误消息中。
flags可以用或的形式指定多个值,它们可以控制函数转换的进制、范围等。
flags可取以下值:GN_NONNEG、GN_GT_0 、GN_ANY_BASE、 GN_BASE_8、 GN_BASE_16
其头文件命名为get_num.h:
/*
FUNC_NAME: get_num.h
FUNC_DESC: Header file for get_num.c.
*/
#ifndef GET_NUM_H
#define GET_NUM_H
#define GN_NONNEG 01 /* Value must be >= 0 */
#define GN_GT_0 02 /* Value must be > 0 */
/* By default, integers are decimal */
#define GN_ANY_BASE 0100 /* Can use any base - like strtol(3) */
#define GN_BASE_8 0200 /* Value is expressed in octal */
#define GN_BASE_16 0400 /* Value is expressed in hexadecimal */
long getLong(const char *arg, int flags, const char *name);
int getInt(const char *arg, int flags, const char *name);
#endif
函数实现为get_num.c:
/*
FUNC_NAME: get_num.h
FUNC_DESC: Functions to process numeric command-line arguments.
*/
#include
#include
#include
#include
#include
#include "get_num.h"
/* Print a diagnostic message that contains a function name ('fname'),
the value of a command-line argument ('arg'), the name of that
command-line argument ('name'), and a diagnostic error message ('msg'). */
static void gnFail(const char *fname, const char *msg, const char *arg, const char *name)
{
fprintf(stderr, "%s error", fname);
if (name != NULL)
fprintf(stderr, " (in %s)", name);
fprintf(stderr, ": %sn", msg);
if (arg != NULL && *arg != '