Для начала это объявление
char *ptr = word;
недопустимо. Инициализатор имеет тип char (*) [40] в соответствии с объявлением параметра word
like
char word[][40]
И нет неявного преобразования из одного типа указателя в другой.
Таким образом, вы должны написать
char ( *ptr ) = word;
В результате эти циклы
while(*ptr != '\0')
{
printf("number of lines = number of elements \n");
ptr++;
}
while(*(word+count) != '\0')
{
count ++;
printf(" element is present"); // it is stuck in a infinite loop here.
}
также неверны, так как слово массива не было инициализировано.
char word[10][40];
Take с учетом того, что переменная word
имеет тип char ( * )[40]
, а затем разыменовывая выражение *(word+count)
, вы получаете объект типа char[40]
. Нет смысла сравнивать его со значением '\0'
, поскольку это сравнение эквивалентно
*(word+count) != NULL
Поскольку левый операнд не является нулевым указателем, тогда условие оценивается как true.
Что касается first
и last
, то они являются локальными переменными функции, которые имеют копии значений переданных аргументов, то есть содержат адреса первых символов массивов, используемых в качестве аргументов функции. Таким образом, изменение локальных переменных не влияет на исходные массивы.
Более того, вы не можете переназначать массив, поскольку массивы являются немодифицируемыми lvalues.
Вы должны копировать строковые литералы в элементы массивы.
Например
strcpy(first, "first word" );
strcpy( last, "last word" );
Вот демонстрационная программа
#include <stdio.h>
#include <string.h>
#define N 40
void f( char *first, char *last )
{
strcpy( first, "first word" );
strcpy( last, "last word" );
}
int main(void)
{
char first[N], last[N];
f( first, last );
printf( "First word = %s, Last word = %s\n", first, last );
return 0;
}
Ее вывод
First word = first word, Last word = last word
enter code here
И еще одна демонстрационная программа
#include <stdio.h>
#define M 10
#define N 40
void f( char word[][N], size_t n )
{
size_t count = 0;
char ( *p )[N] = word;
while ( count < n && **( p + count ) != '\0' ) ++count;
printf( "There are %zu non-empty strings\n", count );
}
int main(void)
{
char word[M][N] =
{
"first", "second", "third"
};
f( word, M );
return 0;
}
Выходные данные
There are 3 non-empty strings
Функция f
верна, поскольку слово массива было инициализировано.