11302
题目
设计一个函数 int parse_u32(const char* s, uint32_t* out);:
- 当
s == NULL或out == NULL时,选择assert还是返回错误?说明理由。 - 当字符串不是合法数字或超出范围时,返回什么错误信息(错误码/
errno)?说明理由。
解析
空指针参数通常表示调用方违反函数契约;字符串内容非法则可能来自用户输入,属于可恢复错误。
答案
一种设计是:
- 对
s != NULL和out != NULL使用assert; - 对格式错误返回
EINVAL; - 对超出
uint32_t范围返回ERANGE; - 成功时返回 0,并把结果写入
*out。
示意代码:
c
#include <assert.h>
#include <errno.h>
#include <stdint.h>
#include <stdlib.h>
int parse_u32(const char* s, uint32_t* out) {
assert(s != NULL);
assert(out != NULL);
char* end;
errno = 0;
unsigned long value = strtoul(s, &end, 10);
if (end == s || *end != '\0') {
return EINVAL;
}
if (errno == ERANGE || value > UINT32_MAX) {
return ERANGE;
}
*out = (uint32_t)value;
return 0;
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23