c ++ toupper () для сравнения двух строк

Я создал набор алгоритмов, который принимает входные данные для строкового вектора, проверяет, встречается ли какая-либо из строк более одного раза: если это так, удаляет все дополнительные вхождения строки из вектора, а затем выводит новый, более «легкий» массив без увольнения.

Это прекрасно работает, за исключением того, что теперь я должен сделать это без учета регистра; Я пытаюсь просто добавить toupper() стандартная функция к == утверждение сравнения, однако, это, кажется, не работает.

У меня есть более знакомый опыт работы с Java, и я пытаюсь изучить C ++.
Может кто-нибудь показать мне, как исправить мой синтаксис?

// Output old list.
cout << endl << "==========\nOld list:\n==========";
for (int i = 0; i < count; i++) {
cout << endl << list[i];
}
cout << endl << endl;

// Check uniqueness.
for (int i = 0; i < count; i++)
for (int j = i+1; j < count; j++) {
if (toupper(list[i]) == toupper(list[j])) {
list[j] = "";
count--;
}
}

// Output new list.
cout << endl << "==========\nNew list:\n==========";
for (int i = 0; i < count; i++) {
cout << endl << list[i];
}
cout << endl << endl;

0

Решение

Ваша петля уходит «дыра» в list массив вектор, но размер массив вектор не меняется (но вы уменьшаете верхнюю границу count)

Вероятно, есть много других альтернатив, но если вы не хотите сильно его изменять, возможно, вам нужно добавить дополнительный цикл для копирования непустой элементы из list массив в новый массив

Изменить: объединение некоторых ответов

Сначала у нас будет функция для выполнения toUpper (она изменена с @ Jim22150)

std::string stringToUpper(const std::string &input) {
std::string toBeModified=input;
std::transform(toBeModified.begin(), toBeModified.end(), toBeModified.begin(), ::toupper);
return toBeModified;
}

Теперь мы не должны оставлять дыры, поэтому мы должны использовать стирание (как указал @Scott Christopher Stauffe):

// Output old list.
cout << endl << "==========\nOld list:\n==========";
for (int i = 0; i < count; i++) {
cout << endl << list[i];
}
cout << endl << endl;

// Check uniqueness.
for (int i = 0; i < count; i++)
for (int j = i + 1; j < count; j++) {
if(stringToUpper(list[i]) == stringToUpper(list[j])) {
list.erase(j,1);
count--;
}
}
}

// Output new list.
cout << endl << "==========\nNew list:\n==========";
for (int i = 0; i < count; i++) {
cout << endl << newlist[i];
}
cout << endl << endl;
1

Другие решения

@DaveS, спасибо, Дэйв, я попробую это; выглядит чисто и коротко. Тем не менее, я нашел более грязное решение с помощью преобразования и создания дубликата старого вектора.

    // Output old list.
cout << endl << "==========\nOld list:\n==========";
for (int i = 0; i < count; i++) {
cout << endl << list[i];
}
cout << endl << endl;

// Check uniqueness.
for (int i = 0; i < count; i++)
for (int j = i + 1; j < count; j++) {
std::transform(list[i].begin(), list[i].end(), list[i].begin(), ::toupper);
std::transform(list[j].begin(), list[j].end(), list[j].begin(), ::toupper);
if (list[i] == list[j]) {
newlist[j] = "";
count--;
}
}

// Output new list.
cout << endl << "==========\nNew list:\n==========";
for (int i = 0; i < count; i++) {
cout << endl << newlist[i];
}
cout << endl << endl;
1

Я только что сделал быстрый гугл о таппере и не нашел ни одной строковой версии. Единственный стандартный touppper (), который я видел, это int toupper(int c); — это означает, что вы можете использовать его только для сравнения отдельных символов! Ты пытался stricmp ()?

        if ( 0 == _stricmp(list[i], list[j]) ) {
list[j] = "";
count--;
}

В зависимости от вашего компилятора вы можете иметь или не иметь эту функцию в вашем распоряжении.

1

Прежде всего,

list[j] = ""; // should never work.

Вы можете удалить символ с помощью стирания.

list.erase(j, 1);

В качестве альтернативы, чтобы избежать всего этого, вы можете использовать временную строку «builder» и просто использовать push_back-символы, когда это необходимо.

0

Если вы хотите обрабатывать строки C ++ так же легко, как строки Java, тогда Библиотека Boost String Algorithms это путь. Установка Boost может быть довольно сложной для начинающего программиста на C ++ (хотя это проще простого по сравнению со многими другими библиотеками C ++), но это окупается.

Ваша проблема будет по существу сведена к этому:

boost::algorithm::to_upper_copy(list[i]) == boost::algorithm::to_upper_copy(list[j])
0
По вопросам рекламы [email protected]