下面是我在解决hackerrank问题时遇到的问题的代码(未变):
但我无法理解3行,在下面的代码中,我将其标记为数字1、2和3。
当程序从main到func的
让我们先来看看3:
我们将函数名lexicographic_sort作为参数之一传递给string_sort函数。
现在让我们看一看1和2:
在函数string_sort中
lexicographic_sort作为int (Cmp_func)传递( const a,const b)*
第一疑问:什么是cmp_func,它不是在任何地方定义的,是系统定义的函数吗?
第二疑问:我们没有传递任何会进入char* a,char* b的参数,它们的值会是什么?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
1. int lexicographic_sort(const char* a, const char* b) {
}
int lexicographic_sort_reverse(const char* a, const char* b) {
}
int sort_by_number_of_distinct_characters(const char* a, const char* b) {
}
int sort_by_length(const char* a, const char* b) {
}
2. void string_sort(char** arr,const int len,int (*cmp_func)(const char* a, const char* b))
{
}
int main()
{
int n;
scanf("%d", &n);
char** arr;
arr = (char**)malloc(n * sizeof(char*));
for(int i = 0; i < n; i++){
*(arr + i) = malloc(1024 * sizeof(char));
scanf("%s", *(arr + i));
*(arr + i) = realloc(*(arr + i), strlen(*(arr + i)) + 1);
}
3. string_sort(arr, n, lexicographic_sort);
for(int i = 0; i < n; i++)
printf("%s\n", arr[i]);
printf("\n");
string_sort(arr, n, lexicographic_sort_reverse);
for(int i = 0; i < n; i++)
printf("%s\n", arr[i]);
printf("\n");
string_sort(arr, n, sort_by_length);
for(int i = 0; i < n; i++)
printf("%s\n", arr[i]);
printf("\n");
string_sort(arr, n, sort_by_number_of_distinct_characters);
for(int i = 0; i < n; i++)
printf("%s\n", arr[i]);
printf("\n");
}发布于 2020-07-06 18:20:25
string_sort函数的目的是按特定顺序对字符串数组进行排序--确切地说,该顺序取决于作为第三个参数传递的函数指示符。
cmp_func是指向函数的指针-声明读取为
cmp_func -- cmp_func
*cmp_func -- is a pointer to
(*cmp_func)( ) -- a function taking
(*cmp_func)( a ) -- parameter a
(*cmp_func)( * a ) -- is a pointer to
(*cmp_func)(const char* a ) -- const char
(*cmp_func)(const char* a, b) -- parameter b
(*cmp_func)(const char* a, * b) -- is a pointer to
(*cmp_func)(const char* a, const char* b) -- const char
int (*cmp_func)(const char* a, const char* b) -- returning int调用string_sort时,传递一个函数指示符作为第三个参数--在本例中,是一个比较函数的名称。然后,string_sort调用该函数作为其操作的一部分,并使用该函数确定如何对数组中的字符串进行排序。
这可能最好用例子来解释。让我们假设string_sort是作为一个简单的旧气泡类型实现的(实际上它可能不会实现,但它可以用于说明性的目的):
void string_sort( char **arr, const int len, int (*cmp_func)(const char *a, const char *b ) )
{
for ( int i = 0; i < len - 1; i++ )
{
for ( j = i+1; j < len; j++ )
{
if ( cmp_func( arr[i], arr[j] ) > 0 )
{
swap( &arr[i], &arr[j] ); // imagine this being implemented elsewhere
}
}
}
}字符串排序的顺序取决于cmp_func所指向的比较函数。通常的协议是,如果第一个参数“大于”第二个参数,则比较函数将返回一个正值;如果第一个参数“小于”第二个参数,则返回一个负值;如果两个值“相等”,则返回一个负值。如果第一个参数比第二个参数“大”,我们将交换字符串,否则我们将它们保留为-原样。
什么“更大”、“更少”和“相等”的含义取决于哪个函数被传递给string_sort for cmp_func。假设arr[i] == "foo"和arr[j] == "bar"。下面是对每个不同的比较函数(基于函数名)的排序方式(很可能):
cmp_func Return value String order
-------- ------------ ------------
lexicographic_sort >0 "bar", "foo"
lexicographic_sort_reverse <0 "foo", "bar"
sort_by_number_of_distinct_characters <0 "foo", "bar"
sort_by_length 0 "foo", "bar"发布于 2020-07-06 17:38:14
函数string_sort
void string_sort( char** arr, const int len, int (*cmp_func)(const char* a, const char* b) );声明为具有三个参数。第一个是char **类型。第二个类型是const int。第三个类型的int (*)(const char* a, const char* b)是第三个参数,它是一个指向函数的指针,它有两个参数类型const char *和返回类型int。函数string_sort中使用此参数来比较两个字符串。
然后调用函数string_sort如下
string_sort( arr, n, lexicographic_sort );第三个参数是lexicographic_sort_reverse声明的函数
int lexicographic_sort_reverse(const char* a, const char* b) {
}它具有函数string_sort的第三个参数的所需类型。用作第三个参数的函数指示符lexicographic_sort被隐式转换为指向该函数的指针。
所以
第一疑问:什么是cmp_func,它不是在任何地方定义的,它是一个系统定义的函数吗?
cmp_func是函数string_sort的参数pf的名称。在一个函数声明中,同时是一个函数定义,参数的名称必须存在。
非定义的函数string_sort的声明可能如下所示
void string_sort( char**, const int, int ( * )(const char*, const char*));也就是说,不需要参数的名称。
您可以想象函数定义及其调用的方式如下
string_sort(arr, n, lexicographic_sort);
//...
void string_sort( /*char** arr,const int len,int (*cmp_func)(const char* a, const char* b) */)
{
char **arr1 = arr; // I changed the name of the parameter to arr1
const int len = n;
int (*cmp_func)(const char* a, const char* b) = lexicographic_sort;
//...
}第二个疑问:我们没有传递任何会进入char* a,char* b的参数,它们的值会是什么?
它本身就是函数string_sort调用,函数lexicographic_sort胸腺被分配给传递给它的参数cmp_func,参数arr指向的字符串在排序期间对它们进行比较。您需要研究函数string_sort的主体。
发布于 2020-07-06 17:51:08
第一疑问:什么是cmp_func,它不是在任何地方定义的,它是一个系统定义的函数吗?
cmp_function不是一个系统函数,它是C中函数的指针,它是将一个函数传递给另一个函数的方法(可以像本例那样作为自定义排序比较器使用,或者在其他用例中用作回调)
对于函数void string_sort(char** arr,const int len,int (*cmp_func)(const char* a, const char* b))
它有三个论点:
arr:指向字符指针的指针
len:int
cmp_funct:指向具有两个参数的函数的指针,这两个参数都是const char*和返回int。
因此,当您调用string_sort时,您必须在第三个参数中传递一个指向函数的指针(函数的名称,或者&在它之前,与这些参数条件匹配,就像int lexicographic_sort_reverse(const char* a, const char* b)和sort_by_number_of_distinct_characters中的情况一样)。
第二个疑问:我们没有传递任何会进入char* a,char* b的参数,它们的值会是什么?
我想这个问题现在已经回答了,因为它们不是函数的参数,它们描述传递给函数指针的参数。
我真的建议你读更多关于指向函数的指针,网上有很多关于它的教程。
https://stackoverflow.com/questions/62761242
复制相似问题