Получить первый элемент из переменной массива, который передается по ссылке - PullRequest
1 голос
/ 12 февраля 2020

У меня проблемы с получением информации об отдельном элементе из ссылок на массив и указатель. Кроме того, я не могу переписать значение указателя и передать его в основную ссылку.

Любая помощь будет принята с благодарностью!

void strings(char word[][40], char *first, char *last, int size);

int main()
{
 char word[10][40];
 char first[40], last[40];
 int i, size;

 printf("Enter size: \n");
 scanf("%d", &size); //storing size
 printf("Enter %d words: \n", size);
 for (i=0; i<size; i++)
 scanf("%s", word[i]); //storing user input
 deriving(word, first, last, size);
 printf("First word = %s, Last word = %s\n", first, last);
 return 0;
}
void deriving(char word[][40], char *first, char *last, int size)
{
    int count = 0;
    char *ptr = word; //why is it when i store the user input as a  ptr variable i am able to get each element?
    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. 
    }

    first = "first word"; //why does this two commands not carry into the main function? since i am rewriting the whole pointer
    last = "last word";

}

1 Ответ

1 голос
/ 12 февраля 2020

Для начала это объявление

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 верна, поскольку слово массива было инициализировано.

...