无法在用户定义的函数中调用库函数

Posted

技术标签:

【中文标题】无法在用户定义的函数中调用库函数【英文标题】:Can't call library function in user defined function 【发布时间】:2021-07-05 09:05:46 【问题描述】:

我正在 c 中创建一个用户定义的 strcmp() 函数。

#include <stdio.h>
#include <string.h>
int la,lb;    // la and lb for length of 2 strings
 
int scompare(char [],char []);

int main() 

 char a[50],b[50];     // a and b are 2 strings

printf("Enter 2 strings \n");
gets(a);
gets(b);
la =strlen(a);
lb =strlen(b);
printf("%d",scompare(a,b));

 
 int scompare(char a[la],char b[lb])
   
     for(int i=0 ;i<max(la,lb);i++)
      // loop for comparing characters of 2 strings

       // here in vs code it is showing error --->
       // warning: implicit declaration of function 'max' [-Wimplicit-function-declaration]

for(int i=0 ;i<max(la,lb);i++)

         int k = a[i]-b[i];// k is the sum of ascii of characters of a and b
   
         if(k!=0 &&toupper(a[i])==toupper(b[i]))
         return (k>0)?1:-1;

         // other error is showing here in function toupper --->  warning: implicit declaration of function 'toupper' [-Wimplicit-function-declaration]

if(k!=0 &&toupper(a[i])==toupper(b[i])) 

         else if(k!=0)
        return k;
    
    
  return 0;
  

【问题讨论】:

"int k = a[i]-b[i]; k 是 a 和 b 字符的 ascii 之和" - 你确定吗?:) 另外,you shouldn't be using the gets function。 k 为非零但字符相同但大小写可疑时的代码; (k&gt;0)?1:-1 的返回与 return k 没有太大区别——如果它仅用于指示排序。 scompare 是否应该进行不区分大小写的比较?它应该做什么? if(k!=0 &amp;&amp;toupper(a[i])==toupper(b[i])) return (k&gt;0)?1:-1;的目的是什么? 【参考方案1】:

在调用函数之前,您需要提供它的声明,该声明可以出现在例如标题中。

C 中没有标准函数max,需要自己编写这样的函数。

要使用标准函数toupper,您需要包含标题&lt;ctype.h&gt;

#include <ctype.h>

这个循环(如果假设函数max在某处定义)

for(int i=0 ;i<max(la,lb);i++)

可以调用未定义的行为,然后字符串的长度不相等。

注意函数gets 不是标准的C 函数。这是不安全的。你应该使用fgets

还有这个函数声明

int scompare(char a[la],char b[lb]);

没有意义。

函数应该像这样声明

int scompare( const char a[], const char b[] );

【讨论】:

Re “而且这个函数声明 int scompare(char a[la],char b[lb]); 没有意义”:声明 scompare 是一个返回 int 并接受参数 ab 的函数分别是 charlalb 元素的数组。 lalb 是之前声明的。 @EricPostpischil 还有什么?在函数声明中使用 la 和 lb 是什么意思? 它向读者传达了数组的预期长度。 @EricPostpischil 你错了。这与数组长度没有什么共同之处。它只是使函数声明依赖于全局变量。 在函数中声明数组参数及其所有维度是例行公事,即使编译器忽略了第一个维度,作为记录预期数组长度的一种方式。该函数实际上依赖于全局变量,无论是否在参数中使用它们,因为它们在函数内部的代码中使用。那是糟糕的设计,但就是这样,问题中显示的参数声明的含义很清楚。【参考方案2】:

在您的代码中,max 和 toupper 没有在任何标题中定义。 我想一定是下面这样。

#include "stdafx.h"
#include <stdio.h>
#include <string.h>
#include <ctype.h>

#define max(a,b)            (((a) > (b)) ? (a) : (b))

int la, lb;

int scompare(char [], char []);

int main()

    char a[50], b[50];

    printf("Enter 2 strings \n");
    gets(a);
    gets(b);

    la = strlen(a);
    lb = strlen(b);
    printf("%d\n", scompare(a, b));


int scompare(char a[], char b[])

    for (int i = 0; i < max(la, lb); i++)
    
        int k = a[i] - b[i];
        if (k && toupper(a[i]) == toupper(b[i]))
        
            return (k > 0 ? 1 : -1);
        
        else if (k)
        
            return k;
        
    
    return 0;

现在它会成功构建,结果是

但是,我认为您的比较功能效率不高。 在我看来

int scompare(char a[], char b[])

    for (int i = 0; i < max(la, lb); i++)
    
        int k = a[i] - b[i];
        if (k == 0) continue;

        return k > 0 ? 1 : -1;
    
    return 0;

【讨论】:

【参考方案3】:

如果您使用其他库中的函数,则需要包含这些库:

#include <ctype.h>

...

if(k!=0 &&toupper(a[i])==toupper(b[i]))
         return (k>0)?1:-1;
...

如果你使用自己的函数,你需要在使用前声明它并在同一个文件中定义它。让我们假设 int max(int, int) 是您的函数:

#include <stdio.h>

/* function declaration */
int max(int lhs, int rhs);

...

/* usage */
int scompare(char a[la],char b[lb])
   
     for(int i=0 ;i<max(la,lb);i++)
     

...

/* definition */
int max(int lhs, int rhs)

    /* implementation */

【讨论】:

以上是关于无法在用户定义的函数中调用库函数的主要内容,如果未能解决你的问题,请参考以下文章

C51 基本函数中断函数和库函数的详解

minGW可以在win下调用linux库函数吗?默认情况下

C语言中的库函数定义在啥地方啊?

C库函数和系统调用的区别

调用一个动态库中的函数,这个函数有一个参数是结构体指针,我如何使用这个指针?

C语言—函数(function)函数定义函数声明函数调用!