【问题标题】:C - Implementing Queue of Char * ArrayC - 实现 Char * 数组的队列
【发布时间】:2018-11-16 09:04:01
【问题描述】:

我想实现一个包含 char * 数组的 10 个元素的队列。我在互联网上搜索但找不到足够的解决方案。 我有一个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 *版本。

【问题讨论】:

  • 你可以使用结构体吗?您的队列是如何实施的? (数组?列表?等等)
  • 只需将int 替换为char *?队列本身不应该有任何不同。
  • 我应该使用 char**(malloc) 而不是 int*(malloc)

标签: c arrays pointers char queue


【解决方案1】:

据我了解您的问题,您需要实现一个字符串类型的队列。

您可以像处理任何其他队列一样执行此操作。但不是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;
}

【讨论】:

  • 我将清除数组,下一个输入将存储在队列的第二个节点中。
  • 你的意思是你想要一个字符串队列。我说的对吗?
  • 是的,完全可以。我想将 char * 数组的字符串存储在队列中。每次我都会清除字符串并将输入放入下一个节点。
  • 你不能简单地使用 c++ std::string 吗,或者它是一些家庭作业,在 c++ 中实现它会容易得多。无论如何,到目前为止你有没有做过一些事情,它会更容易解决如果您发布队列的实现(如果有),您的问题。
  • 这可能更容易,但我现在正在研究 C,谢谢。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多