Как получить массив символов в функции C?

Я хочу разделить «строку» на символ «,». Строка содержит строку в кодировке GPS NMEA, но это не имеет значения.

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

Как мне правильно передать «строку символов []» функции, чтобы я мог работать с этим параметром, как я его отправил (как массив символов, а не указатель символов на массив).

Мне также нужно указать, что я использую mikroC для PIC.

Вот мой код на данный момент:

char* GPS_sateliti;
char CsatInView[] = 
"$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74";

GPS_sateliti = GrupeazaDupaVirgule(CsatInView, 2);

char* GrupeazaDupaVirgule( char deGasit[],int nrVirgule ){
    int cVirgule = 1;
    char* pch = strtok (deGasit,",");

    while (pch != 0)
    {
       pch = strtok (0, ",");
       cVirgule++;
       if(nrVirgule == cVirgule){
          break;
    }
}
return pch;
}

Функция, которая работает с массивом символов, полученным в качестве параметра в режиме отладки, до входа в функцию массив символов в порядке, после входа он как бы пустой Функция, работающая с массивом символов, полученным в качестве параметра в  режим отладки, до входа в функцию массив char в порядке, после входа он как бы пустой

Может быть, я должен получить указатель на массив символов?? Любые советы приветствуются. Спасибо


person Fluffy    schedule 01.06.2017    source источник
comment
Как вы определили, что все было в порядке до функции?   -  person Scott Hunter    schedule 01.06.2017
comment
Как вы вызываете функцию? Вот где проблема должна быть. Попробуйте создать минимальный, полный и проверяемый пример и покажите нам. Кроме того, во время отладки, почему вы не прошлись по коду перед вызовом, чтобы посмотреть, что происходит со строкой, передаваемой в функцию?   -  person Some programmer dude    schedule 01.06.2017
comment
Да, и кстати, функция strtok изменяет строку, которую она размечает (см. эту strtok ссылку для получения дополнительной информации). Может ли это быть проблемой?   -  person Some programmer dude    schedule 01.06.2017


Ответы (2)


С указателем:

char* arr; 
yourFunction(arr);

Если вы хотите инициализировать его раньше:

char* arr = malloc(51 * sizeof(char)); // Allocate a memory place of 50 because strings are null terminated in C
yourFunction(arr);

Другой способ выделить память для массива:

char* arr = calloc(50, sizeof(char)); // Allocate 50 memory place which size if the size of a char

Со строкой:

char arr[50];
char* ptr = arr;
yourFunction(ptr);

Вы должны знать, что в C невозможно узнать размер массива при использовании указателя. Единственное, что вы можете сделать, это проанализировать размер строки как параметр:

size_t size = 50;
char arr[size];
char* ptr = arr;
yourFunction(ptr, size);

Если вы хотите подробно понять, как работает указатель и как их перебирать, может быть этот пост может вам помочь. Я думаю, это очень интересно. Глобально вы перебираете массив с помощью указателя следующим образом:

for ( int i = 0; i < size; i++)
    printf("Current pointed value in the array : %c\n", ptr[i]); // or arr[i]

Я думаю, вы понимаете, почему важно указать size массива с точками в качестве параметра. Иногда вы можете избежать использования этого параметра следующим образом:

for ( int i = 0; i != '\0'; i++) // Because strings are null-terminated in C.
    // Do something
person Badda    schedule 01.06.2017
comment
Спасибо, когда я впервые прочитал ответ Феликса, я должен признать, что был немного сбит с толку, но вы выяснили, как определить размер моего массива. - person Fluffy; 01.06.2017
comment
Если вам нужно, malloc и calloc документации. Не волнуйтесь, если выделение памяти кажется сложным: это одна из основных причин ошибок в C и одна из самых сложных функций этого языка, если не самая. - person Badda; 01.06.2017
comment
@Fluffy Я отредактировал свой ответ, чтобы немного объяснить, как использовать указатель на строку в функции. Надеюсь, это поможет - person Badda; 01.06.2017
comment
Боже мой, ты сделал это слишком простым для меня :) теперь я точно знаю, что делать с моим массивом, я создам новый внутри функции, так как он мне может понадобиться для другого дела, большое спасибо: o - person Fluffy; 01.06.2017

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

Вы не можете. Параметр функции типа массива всегда затухает как соответствующий тип указателя.

Есть два идиоматических решения.

1. часовой:

Последнее значение в массиве — это специальное значение, обозначающее конец. Это делается в C со строками. Они всегда заканчиваются символом \0, который гарантированно не встречается внутри строки. Функция может искать этот символ, чтобы узнать, где заканчиваются данные.

(Примечание: с этой информацией я должен добавить, что я не уверен, в чем ваша проблема. Если вы передаете пустую строку, как буквально "", там будет \0, так что у вас не должно быть проблем)< /эм>

2. явно передать размер:

вместо того, чтобы просто

void foo(int bar[]);

вы определяете функцию

void foo(size_t barSize, int bar[]);

Вызывающий объект знает размер массива, поэтому он может просто передать его.

person Community    schedule 01.06.2017
comment
Хорошо, я попробую так, спасибо, что прояснили ситуацию :) Не могли бы вы немного рассказать, как я могу переделать свой массив в функции? Я думаю, перебирая char* с помощью for и останавливаясь на индексе размера ?? - person Fluffy; 01.06.2017