Скажем, я пытаюсь сделать следующее (это подпункт того, чего я пытаюсь достичь):
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
.
В 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);
}
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... Зачем изобретать колесо...
std::string
.std::vector
.