C-Char * Array的实现队列

时间:2018-11-16 09:04:02

标签: c arrays pointers char queue

我想实现一个队列,该队列包含char *数组的10个元素。我在互联网上搜索,但找不到足够的解决方案。 我有一个char数组:

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

然后用户输入一些带有退格字符的字符串,例如“ Hello I am computer”。字符串位于str[]数组中。我使用strtok()函数标记它们并将其分配给arr[]。然后它变为:

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

到目前为止还可以,我做得正确。

现在我的问题是如何将整个arr数组保存在队列的第一个节点或元素中。有很多有关队列的示例,其中包含int个值,它们很容易理解,但我无法使用char *版本。

2 个答案:

答案 0 :(得分:0)

据我所知,您需要实现一个字符串类型的队列。

您可以像处理其他任何队列一样进行操作。但是,代替int的类型是char*,您还需要传递单词的长度,以便可以取消引用很多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;
}

答案 1 :(得分:0)

首先,将地址保存到以后要使用的变量时必须小心。您必须确保从指针读取时指针所保持的地址仍然有效:

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:我没有对此进行编译,所以我不确定它是否有效,这只是一个例子。