#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