如何声明一个空的char *并动态增加大小?

时间:2014-07-11 23:15:48

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

让我们说我正在尝试做以下事情(这是我想要实现的一个子问题):

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");时,我在复制线上收到错误。它说我正在使用temp未初始化。然后我使用char* temp = new char[];在这种情况下,函数返回1而不是0.当我调试时,我看到temp以一些长度为16的随机字符开始,strcmp因此而失败。

有没有办法声明一个空的char *并仅动态增加大小和我需要的内容?有什么办法让这个功能起作用?我不想使用std::string

2 个答案:

答案 0 :(得分:5)

在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);
}

答案 1 :(得分:0)

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(*(句子+(i))),它至少会捕获所有空格。 但是,一般情况下,我会使用库或STL ...为什么要重新发明轮子......