Указатель и функции - PullRequest
       0

Указатель и функции

0 голосов
/ 28 апреля 2018

Я новичок в программировании на Си. Я написал этот код из библиотеки RTKLIB .

extern void satno2id(int sat, char *id)
{
    int prn;

    switch (satsys(sat, &prn)) {
        case SYS_GPS: sprintf(id,"G%02d",prn-MINPRNGPS+1); return;
        case SYS_GLO: sprintf(id,"R%02d",prn-MINPRNGLO+1); return;
        case SYS_GAL: sprintf(id,"E%02d",prn-MINPRNGAL+1); return;
        case SYS_BDS: sprintf(id,"C%02d",prn-MINPRNBDS+1); return;
    }
    strcpy(id, "");
}

В этой функции первым аргументом является Input, а вторым - Output. Теперь вопрос в том, как получить значение второго аргумента в функции main()? Я написал этот блок кода, но он получает ошибку. Что здесь не так?

int main(){
    char *id;
    satno2id(68, &id);
    printf("satellite number is %s", *id);
}

Ответы [ 2 ]

0 голосов
/ 28 апреля 2018

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

#include <assert.h>

#define LEN(array) (sizeof (array) / sizeof (array)[0])

extern void satno2id(int sat, char id[], int idLen)
{
    int prn;

    assert(idLen >= 4 + 1);

    switch (satsys(sat, &prn)) {
    case SYS_GPS:
        sprintf(id, "G%02d", prn - MINPRNGPS + 1);
        break;
    case SYS_GLO:
        sprintf(id, "R%02d", prn - MINPRNGLO + 1);
        break;
    case SYS_GAL:
        sprintf(id, "E%02d", prn - MINPRNGAL + 1);
        break;
    case SYS_BDS:
        sprintf(id, "C%02d", prn - MINPRNBDS + 1);
        break;
    default:
        strcpy(id, "");
    }
}

int main(void)
{
    char id[8];

    satno2id(68, id, LEN(id));
    printf("satellite number is %s\n", id);
    return 0;
}
0 голосов
/ 28 апреля 2018

В C имя массива ухудшается до указателя на первый элемент этого массива.

id в функции ожидает указатель на первый элемент массива символов (строку). Это очевидно, потому что функция sprintf(), которая используется для записи в массив символов, используется в satno2id().

Так что отправьте массив char вместо

char id[4];
satno2id(68, id);

Я сделал размер массива равным 4, так как satno2(), кажется, пишет строку длины 3. Дополнительный байт должен хранить терминатор \0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...