无法在用户定义的函数中调用库函数
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 thegets
function。
k
为非零但字符相同但大小写可疑时的代码; (k>0)?1:-1
的返回与 return k
没有太大区别——如果它仅用于指示排序。 scompare
是否应该进行不区分大小写的比较?它应该做什么? if(k!=0 &&toupper(a[i])==toupper(b[i])) return (k>0)?1:-1;
的目的是什么?
【参考方案1】:
在调用函数之前,您需要提供它的声明,该声明可以出现在例如标题中。
C 中没有标准函数max
,需要自己编写这样的函数。
要使用标准函数toupper
,您需要包含标题<ctype.h>
#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
并接受参数 a
和 b
的函数分别是 char
和 la
和 lb
元素的数组。 la
和 lb
是之前声明的。
@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 */
【讨论】:
以上是关于无法在用户定义的函数中调用库函数的主要内容,如果未能解决你的问题,请参考以下文章