Функция c не вызывается

#c #string-comparison #c-strings #function-call #function-definition

#c #сравнение строк #c-строки #вызов функции #функция-определение

Вопрос:

моя написанная функция C не вызывается, хотя я передаю функции два символа. Я не получаю возвращаемое значение, которое я ожидал бы от цикла while. У кого-нибудь есть идеи, в чем проблема?

 int string_compare(char v[], char w[]);

int main (void) {
  char v[] = "N";
  char w[] = "M";
  int string_compare(char v[], char w[]);
  return 0;
}

int string_compare(char v[], char w[])
{
  int i = 0;
  while (1) {
    if (v[i] != w[i]) {
      return v[i] - w[i];
    }
    if (v[i] == '' || w[i] == '') {
      break;
    }
      i;
  }
  return 0;
}
 

Спасибо!

Макс .

Комментарии:

1. Вы не вызываете ее, а избыточно объявляете ее внутри main() .

Ответ №1:

Проще говоря, int string_compare(char v[], char w[]); это объявление функции, а не вызов функции. Вызов функции будет выглядеть int result = string_compare(v, w); следующим образом .

Ответ №2:

Здесь много неправильного. Для вызова функции string_compare вам нужно передать ей два массива символов. Затем вам нужно присвоить возвращаемое значение переменной.

Итак

 int string_compare(char v[], char w[]);

int main (void) {
  char v[] = "N";
  char w[] = "M";
  int x = string_compare(v, w);
  printf("%dn", x);
  return 0;
}

int string_compare(char v[], char w[])
{
  int i = 0;
  while (1) {
    if (v[i] != w[i]) {
      return v[i] - w[i];
    }
    if (v[i] == '' || w[i] == '') {
      break;
    }
      i;
  }
  return 0;
}
 

Ответ №3:

Для начала функция должна быть объявлена как минимум как

 int string_compare( const char s1[], const char s2[] );
 

То есть параметры должны иметь квалификатор const , потому что функция не должна изменять переданные ей строки.

Условие в этом операторе if

 if (v[i] == '' || w[i] == '') {
 

может быть упрощено следующим образом

 if ( v[i] == '' ) {
 

потому что, когда элемент управления достигает этой точки v[i] и w[i] равны друг другу. Поэтому достаточно проверить только один символ, равен ли он нулю.

Переменная i , используемая в качестве индекса

 int i = 0;
 

должен иметь тип size_t , потому что объект типа int в общем случае не может хранить все значения типа size_t (длины строки), который является типом возвращаемого значения функции strlen или оператора sizeof .

 size_t i = 0;
 

Однако введение этой вспомогательной переменной является избыточным.

В любом случае определение функции слишком сложно.

Наконец-то эта запись в функции main

 int string_compare(char v[], char w[]);
 

является избыточным объявлением функции. Функция main не вызывает функцию string_compare . Он объявляет его только еще одним в своей области действия блока.

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

 #include <stdio.h>

int string_compare( const char s1[], const char s2[] )
{
    while ( *s1 amp;amp; *s1 == *s2 )
    {
          s1;   s2;
    }
    
    return *s1 - *s2;
}

int main(void) 
{
    char *s1 = "N";
    char *s2 = "M";
  
    printf( "string_compare( "%s", "%s" ) = %dn", s1, s2,
                             string_compare( s1, s2 ) );
  
    printf( "string_compare( "%s", "%s" ) = %dn", s2, s1,
                             string_compare( s2, s1 ) );
                           
    s2 = s1;
    
    printf( "string_compare( "%s", "%s" ) = %dn", s1, s2,
                             string_compare( s1, s2 ) );
  
                           
  
  return 0;
}
 

Вывод программы

 string_compare( "N", "M" ) = 1
string_compare( "M", "N" ) = -1
string_compare( "N", "N" ) = 0