Указатели и символьные массивы из строк - PullRequest
0 голосов
/ 16 октября 2018

Привет, я читаю часами и до сих пор не могу понять преобразования между

{
    char i ="adf";
    char foo[];
    char bar[256];
}

, а добавление * и & делает это более запутанным

У меня есть некоторыекод, который работает.

int TX_SEND(char send[])
{
    unsigned char *p_tx_buffer;
    p_tx_buffer = &send[0];
    strcat(send, "\r");
    // Write to the port

    int n = write(fd,&send[0],3);
    if (n < 0) {
        perror("Write failed - ");
        return -1;
    }
    return(0);
}

код работает, но мне нужна помощь с 2 частями.

  1. Я хочу иметь возможность запускать эту функцию примерно как printf IE TX_SEND("AT+CGMSD=STUFF");, но я застрял

, но перед этим я делаю это много.

 char txsend[] = "at";
 TX_SEND(txsend);
Также внутри моего TX_WRITE() я использую write(fd,&send[0],3), но он жестко запрограммирован для отправки 3 байтов из send[].Я хочу, чтобы это было динамически, поэтому я могу просто посылать строки любой длины (реально они всегда будут меньше 300 символов ASCII).Я пытался что-то сделать с указателем, но сдался (*p_tx_buffer была моей первой попыткой).

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

Я не собираюсь разбирать ваш код построчно, но я призываю вас сосредоточиться на следующих фактах:

  1. символы - это символы, а строки - это строки, а никогда не двойнявстретимся.(Они совершенно разные.)
  2. 'x' - символьная константа.
  3. "x" - строковая константа.
  4. Строка - это массив символов (заканчивается '\0').
  5. Когда вы упоминаете массив (включая строку) в контексте, где вам нужно его значение, вы получаете указатель на первый элемент массива.
  6. Когда вы помещаете & перед чем-то, вы получаете указатель на это что-то.
  7. Когда вы помещаете * перед указателем, вы получаете то, что указательуказывает на.

Соединив это, мы могли бы написать

char str[] = "xyz";
char *p = str;       /* per rule 5, this is fine, and p gets a pointer to str's first element */
char c = *p;         /* per rule 7, c gets the first character of str, which is 'x' */
printf("%c\n", c);

Если вы только начинаете с C, возможно, вы еще не сталкивались с правилом 5.Это, вероятно, удивит вас сначала.Однако изучите его хорошо: без него вы никогда не поймете массивы и указатели на C.

0 голосов
/ 16 октября 2018

Я думаю, что вы хотите

int TX_SEND(char *send)
{


    int n = write(fd,send,strlen(send));
    if (n < 0) {
            perror("Write failed - ");
            return -1;
    }
    return(0);
}

, вы не можете нажать \ n для отправки с помощью strcat.Я бы добавил его в вызывающую функцию или объявил бы промежуточный буфер и sprintf к нему

вот так

int TX_SEND(char *send)
{
    char buff[50]; // i dont know a good max size
    snprintf(buff, sizeof(buff), "%s\n", send);

    int n = write(fd,buff,strlen(buff));
    if (n < 0) {
            perror("Write failed - ");
            return -1;
    }
    return(0);
}
...