Я делаю определяемую пользователем функцию strcmp () в c.

#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;
 } 
0
Ashish Kushaj 5 Июл 2021 в 12:05

3 ответа

Лучший ответ

Перед вызовом функции вам необходимо предоставить ее объявление, которое может присутствовать, например, в заголовке.

В C. нет стандартной функции max. Вам нужно написать такую ​​функцию самостоятельно.

Чтобы использовать стандартную функцию toupper, вам необходимо включить заголовок <ctype.h>

#include <ctype.h>

Этот цикл (если предположить, что функция max где-то определена)

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

Может вызывать неопределенное поведение, тогда длины строк не равны друг другу.

Обратите внимание, что функция gets не является стандартной функцией языка Си. Это небезопасно. Вам следует использовать fgets.

И это объявление функции

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

Не имеет смысла.

Функция должна быть объявлена как

int scompare( const char a[], const char b[] );
1
Vlad from Moscow 5 Июл 2021 в 09:20

В вашем коде 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;
}

Теперь он будет успешно построен, и результат введите описание изображения здесь

Но я думаю, что ваша функция scompare неэффективна. по моему мнению

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;
}
0
secuman 5 Июл 2021 в 09:57

Если вы используете функции из других библиотек, вам необходимо включить эти библиотеки:

#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 */
}
0
Igor_M 5 Июл 2021 в 10:01