【问题标题】:How to declare an empty char* and increase the size dynamically?如何声明一个空的 char* 并动态增加大小?
【发布时间】:2026-01-15 21:30:02
【问题描述】:

假设我正在尝试执行以下操作(这是我想要实现的子问题):

int compareFirstWord(char* sentence, char* compareWord){
      char* temp; int i=-1;
      while(*(sentence+(++i))!=' ') { *(temp+i) = *(sentence+i); }
      return strcmp(temp, compareWord); }

当我运行compareFirstWord("Hi There", "Hi"); 时,我在复制行出现错误。它说我正在使用未初始化的临时。然后我使用了char* temp = new char[];,在这种情况下,函数返回1而不是0。当我调试时,我看到temp以一些长度为16的随机字符开头,strcmp因此而失败。

有没有办法声明一个空的 char* 并将大小动态增加为我需要的长度和内容?有什么方法可以使该功能起作用吗?我不想使用std::string

【问题讨论】:

  • 使用std::string
  • 然后使用std::vector
  • 你为什么不想使用std::string?如果你真的不能足够公平地使用它,但是如果你可以使用它并且只是不想,我认为你应该,你可以添加一个字符带有str.push_back(a_char) 的字符串您可以为带有str.reserve(size) 的字符串保留空间并使用str.capacity() 检查分配的空间,然后str.shrink_to_fit() 减少字符串容量以适应实际的str.size(),可以使用@ 设置/重置987654334@,如果您需要 char * 等效的字符串,您可以调用 str.c_str() 并使用 str.clear() 清除字符串
  • 感谢您非常清楚的解释!

标签: c++ c char dynamic-memory-allocation strcmp


【解决方案1】:

在 C 中,你可以这样做:

int compareFirstWord(const char* sentence, const char* compareWord)
{
    while (*compareWord != '\0' && *sentence == *compareWord) {
        ++sentence;
        ++compareWord;
    }
    if (*compareWord == '\0' && (*sentence == '\0' || *sentence == ' ')) {
        return 0;
    }
    return *sentence < *compareWord ? -1 : 1;
}

使用std::string,您只需:

int compareFirstWord(const std::string& sentence, const std::string& compareWord)
{
    return sentence.compare(0, sentence.find(" "), compareWord);
}

【讨论】:

    【解决方案2】:

    temp 是一个未初始化的变量。

    您似乎正试图从循环中的句子中提取第一个单词。

    为了做到这一点,您首先必须将 temp 初始化为至少与您的句子一样长。

    另外,您的句子中可能没有空格。 (句号,\t,\r,\n呢?这些重要吗?)

    此外,您必须以空字符终止 temp。

    你可以试试:

    int len = strlen(sentence);
    char* temp = new char[len + 1];
    int i = 0;
    
    while(i < len && *(sentence+(i))!=' ') {
       *(temp+i) = *(sentence+i); 
       i++;
    }
    *(temp+i) = '\0';
    int comparable = strcmp(temp, compareWord);
    delete temp;
    return comparable;
    

    还可以考虑使用 isspace(*(sentence+(i))),它至少可以捕获所有空格。 但是,总的来说,我会使用库或 STL... 为什么要重新发明*...

    【讨论】:

    • 在初始化 temp 后,你也可以使用 strcpy,然后将第一个空格设置为 '\0'
    • 根据您是否信任句子的来源,请注意它们的形式可能不正确,带有空终止符。这可能导致缓冲区溢出或其他问题。例如,我相信 strlen 需要以空字符结尾的字符串。
    • 顺便说一句,你有内存泄漏。
    • []delete 之后丢失,应该是delete [] temp;
    • 抱歉——这是一个糟糕的答案。不要永远在实际代码中使用它。这很容易出错。唯一可以弥补这个答案的是最后一句话,但我准备打赌 OP 忽略了这一点。