我想实现一个队列,该队列包含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 *
版本。
答案 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:我没有对此进行编译,所以我不确定它是否有效,这只是一个例子。