从以 'NULL' 作为参数的函数返回值
Returning value from a function with 'NULL' as parameter
我有一个作业,其中函数 return 数组中元素的最小值和最大值。但是我还必须使用 'NULL' 参数从函数中获取 return 值,但我不明白。
我的代码:
int array_min(const int [], const int);
int array_max(const int [], const int);
int main() {
int input_arr[] = {2,3,4,5,6};
printf("%d\t", array_min(input_arr, 5));
// : 2
printf("%d\t", array_max(input_arr, 5));
// : 6
printf("%d\t", array_max(NULL, 5));
// : -1
return 0;
}
int array_min(const int input_arr[], const int arr_size) {
int a, b = arr_size, min = input_arr[0];
for(a = 0; a < b; a++) {
if(input_arr[a] < min) {
min = input_arr[a];
}
}
return min;
}
int array_max(const int input_arr[], const int arr_size) {
int a, b = arr_size, max = input_arr[0];
for(a = 0; a < b; a++) {
if(input_arr[a] > max) {
max = input_arr[a];
}
}
return max;
}
所以,我的问题是,如何在函数中使用 'NULL' 来获得 return 值 -1?
how do I use 'NULL' in function to get return value -1?
参数输入验证是一项常见的任务。预先进行简单测试。
输入麻烦时:
int array_min(const int input_arr[], const int arr_size) {
if (input_arr == NULL || arr_size <= 0) {
return -1;
}
...
Return错误时使用 -1 是一个薄弱的设计选择,因为它无法与良好的 return of -1:
区分开来
int input_arr[] = {-1, 2, 3, 4, 5};
printf("%d\t", array_min(input_arr, 5));
functions return MIN and MAX value of elements in an array.
改为考虑:return minimum/maximum 的地址。 Return NULL
出错。
// int array_min(const int input_arr[], const int arr_size) {
const int *array_min(const int input_arr[], const int arr_size) {
if (input_arr == NULL || arr_size <= 0) {
return NULL;
}
//int a, b = arr_size, min = input_arr[0];
int a, b = arr_size;
const char *min = &input_arr[0];
// for(a = 0; a < b; a++) {
for(a = 1; a < b; a++) { // No need to test input_arr[0]
//if(input_arr[a] < min) {
if(input_arr[a] < *min) {
//min = input_arr[a];
min = &input_arr[a];
}
}
return min;
}
现在调用代码可以检测问题了。
// printf("%d\t", array_min(input_arr, 5));
const int *min = array_min(input_arr, 5);
// or
const int *min = array_min(input_arr, 0);
// or
const int *min = array_min(NULL, 5);
if (min) {
printf("%d\t", *min);
} else {
printf("Min not found\t");
}
它是 @chux-ReinstateMonica
答案的修改版本,有一些变化。
- 尺寸使用
size_t
(而非 int
)。
- 如果可能,请尝试从函数中获得一个 return 点
- 无需检查索引
0
,因为它将等于 min
值
- 在这种情况下,最好保留值和最小值的索引而不是指向它的指针(这将有助于编译器优化代码)
const int *array_min1(const size_t arr_size, const int input_arr[arr_size]) {
const int *result = arr_size ? input_arr : NULL;
if (result)
{
size_t a, min_index = 0;
int min = input_arr[0];
for(a = 1; a < arr_size; a++) {
if(input_arr[a] < min) {
min = input_arr[a];
min_index = a;
}
}
result = input_arr + min_index;
}
return result;
}
我有一个作业,其中函数 return 数组中元素的最小值和最大值。但是我还必须使用 'NULL' 参数从函数中获取 return 值,但我不明白。
我的代码:
int array_min(const int [], const int);
int array_max(const int [], const int);
int main() {
int input_arr[] = {2,3,4,5,6};
printf("%d\t", array_min(input_arr, 5));
// : 2
printf("%d\t", array_max(input_arr, 5));
// : 6
printf("%d\t", array_max(NULL, 5));
// : -1
return 0;
}
int array_min(const int input_arr[], const int arr_size) {
int a, b = arr_size, min = input_arr[0];
for(a = 0; a < b; a++) {
if(input_arr[a] < min) {
min = input_arr[a];
}
}
return min;
}
int array_max(const int input_arr[], const int arr_size) {
int a, b = arr_size, max = input_arr[0];
for(a = 0; a < b; a++) {
if(input_arr[a] > max) {
max = input_arr[a];
}
}
return max;
}
所以,我的问题是,如何在函数中使用 'NULL' 来获得 return 值 -1?
how do I use 'NULL' in function to get return value -1?
参数输入验证是一项常见的任务。预先进行简单测试。
输入麻烦时:
int array_min(const int input_arr[], const int arr_size) {
if (input_arr == NULL || arr_size <= 0) {
return -1;
}
...
Return错误时使用 -1 是一个薄弱的设计选择,因为它无法与良好的 return of -1:
区分开来int input_arr[] = {-1, 2, 3, 4, 5};
printf("%d\t", array_min(input_arr, 5));
functions return MIN and MAX value of elements in an array.
改为考虑:return minimum/maximum 的地址。 Return NULL
出错。
// int array_min(const int input_arr[], const int arr_size) {
const int *array_min(const int input_arr[], const int arr_size) {
if (input_arr == NULL || arr_size <= 0) {
return NULL;
}
//int a, b = arr_size, min = input_arr[0];
int a, b = arr_size;
const char *min = &input_arr[0];
// for(a = 0; a < b; a++) {
for(a = 1; a < b; a++) { // No need to test input_arr[0]
//if(input_arr[a] < min) {
if(input_arr[a] < *min) {
//min = input_arr[a];
min = &input_arr[a];
}
}
return min;
}
现在调用代码可以检测问题了。
// printf("%d\t", array_min(input_arr, 5));
const int *min = array_min(input_arr, 5);
// or
const int *min = array_min(input_arr, 0);
// or
const int *min = array_min(NULL, 5);
if (min) {
printf("%d\t", *min);
} else {
printf("Min not found\t");
}
它是 @chux-ReinstateMonica
答案的修改版本,有一些变化。
- 尺寸使用
size_t
(而非int
)。 - 如果可能,请尝试从函数中获得一个 return 点
- 无需检查索引
0
,因为它将等于min
值 - 在这种情况下,最好保留值和最小值的索引而不是指向它的指针(这将有助于编译器优化代码)
const int *array_min1(const size_t arr_size, const int input_arr[arr_size]) {
const int *result = arr_size ? input_arr : NULL;
if (result)
{
size_t a, min_index = 0;
int min = input_arr[0];
for(a = 1; a < arr_size; a++) {
if(input_arr[a] < min) {
min = input_arr[a];
min_index = a;
}
}
result = input_arr + min_index;
}
return result;
}