Как объявить пустой символ * и динамически увеличить его размер?

0

Скажем, я пытаюсь сделать следующее (это подпункт того, чего я пытаюсь достичь):

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 uninitialized. Затем я использовал char* temp = new char[]; В этом случае функция вернула 1, а не 0. Когда я отлаживался, я видел темп, начинающийся с некоторых случайных символов длиной 16, и strcmp терпит неудачу из-за этого.

Есть ли способ объявить пустой символ * и увеличить размер динамически только до длины и содержимого того, что мне нужно? Любой способ заставить функцию работать? Я не хочу использовать std::string.

  • 7
    Используйте std::string .
  • 3
    Тогда используйте std::vector .
Показать ещё 2 комментария
Теги:
char
strcmp
dynamic-memory-allocation

2 ответа

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);
}
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 (* (sentence+ (i))), который, по крайней мере, поймает все пробелы. В общем, однако, я бы использовал библиотеку или STL... Зачем изобретать колесо...

  • 0
    После инициализации temp вы также можете использовать strcpy, а затем установить первый пробел с помощью \ 0
  • 0
    В зависимости от того, доверяете ли вы источнику своих предложений, имейте в виду, что они могут быть не в правильной форме, с нулевым терминатором. Это может привести к переполнению буфера или другим проблемам. Я считаю, что strlen требует строки с нулевым символом в конце.
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню