C - Реализация очереди Char * Array - PullRequest
0 голосов
/ 16 ноября 2018

Я хочу реализовать очередь, которая содержит 10 элементов массива char *.Я искал в Интернете, но не смог найти достаточно решений.У меня есть массив char:

char str[50]: 
char *arr[5];

И пользователь вводит некоторую строку с символом возврата, например, «Здравствуйте, я компьютер».Строка находится в массиве str[].Я помечаю их с помощью функции strtok() и присваиваю ее arr[]. Затем она становится:

//arr[0] = "Hello"
//arr[1] = "I"
//arr[2] = "am"
//arr[3] = "computer"

Пока все нормально, я делаю это правильно.

Теперь мойВопрос в том, как хранить весь этот массив arr в первом узле или элементе очереди.Существует множество примеров очереди, которые содержат значения int, и их легко понять, но я не смог сделать версию char *.

Ответы [ 2 ]

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

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

int main()
{
   char str[] = "Hello I am computer";   // "Hello I am computer" is stored on the stack
   AddStringToQueue(str[0]);   
}
// str could be overwritten by another function who allocates local variables

Как вы сказали в комментарии, вы должны использовать void* malloc(sizeof("Hello I am computer")), который возвращает начальный указатель вашей выделенной памяти,

Другое дело, почему вы хотите хранить строку как токены?Не проще ли сохранить всю строку ("Hello I am computer") и использовать первый символ в качестве начального адреса строки?Если вам нужны токены, вы можете вызвать strtok () после того, как прочитали очередь.

Позвольте мне привести пример:

#define QUEUE_MAX 10
int QueuePos = 0;
char* Queue[QUEUE_MAX];
memset(Queue, NULL, sizeof(Queue));

// call AddStringToQueue("Hello I am computer"); anywhere

void AddStringToQueue(char* string)
{
   char* ptr = (char*)malloc(sizeof(string));
   memcpy(ptr, string, sizeof(string));
   Queue[QueuePos++] = ptr;
   if (QueuePos == QUEUE_MAX) QueuePos = 0;  // overwrites Queue if max. is reached
}

Я не уверен, что вы имеете в виду это.

Надеюсь, это поможет.

PS: Я не скомпилировал это, поэтому я не уверен, что это работает, это просто пример.

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

Насколько я понял ваш вопрос, вам нужно реализовать очередь типа string.

Вы можете сделать это так же, как и с любой другой очередью. Но вместо int она будет иметь тип char*, вам также нужно будет передать длину слова, чтобы вы могли разыменовать это число, начиная с char. от указателя на символ до длины слова.

void Enqueue(char* x, int len)
{
    // if empty 
        front = rear = 0; 
    // else 
        rear = (rear+1);
    char ch[100];
    for(int i=0;i<len;i++) {
        ch[i] = *(x+i);
    }
    Arr[rear] = ch;
}
...