#c #compiler-errors #warnings #compiler-warnings
#c #ошибки компилятора #предупреждения #компилятор-предупреждения
Вопрос:
Вот код :
void SomeClass::SomeFunctionToCorrectName(CString amp;strName)
{
// Only alphabets (Aa-Zz), numbers(0-9), "_" (underscore) and "-" (hyphen) are allowed.
for(int nIndex = 0; nIndex < strName.GetLength(); nIndex )
{
TCHAR currentChar = strName.GetAt(nIndex);
if((currentChar >= _T('a') amp;amp; currentChar <= _T('z')) ||
(currentChar >= _T('A') amp;amp; currentChar <= _T('Z')) ||
(currentChar >= _T('0') amp;amp; currentChar <= _T('9')) ||
currentChar == _T('-') || currentChar == _T('_'))
{
continue;
}
strName.Replace(currentChar,_T(''));
}
}
Этот метод удаляет все лишнее strName
и разрешены только алфавиты (Aa-Zz), цифры (0-9), «_» (подчеркивание) и «-» (дефис). Случаи if должны проверять эти допустимые условия.
Если это не соответствует допустимым условиям, это удалит это.
For Eg desired i/p :"Hel*lo*World" and desired o/p : "HelloWorld"
Но следующее выдает мне ошибку следующим образом :
error C2137: empty character constant
I can fix this error by using any of the three methods:
1. using ''
2. using ' ' (space in between ' ')
3. using ""[0]
но это вводит пробел при замене.
Input :Hel*lo*World
Output :Hel lo World
Desired Output :HelloWorld
Кто-нибудь может подсказать, как я могу получить желаемый результат?
Комментарии:
1. Примечание: не гарантируется, что a-z, A-Z будут последовательными в C (как EBCDIC).
Ответ №1:
Если вы хотите удалить определенный символ, то Replace
это неправильный метод для использования. Как вы заметили, нет ничего разумного для замены символа.
Вместо этого вы можете использовать Remove
так:
strName.Remove(currentChar);
Комментарии:
1. Затем нужно исправить увеличение индекса, и поэтому перейдите к идиоме erase-remove 🙂
2. @MALLASARJSULEBHANVI Хорошо 🙂 Но Jarod42 делает хороший вывод. Я действительно не смотрел на остальную часть цикла. Убедитесь, что
nIndex
это то значение, которое вам нужно.3. @cigien Хорошо, здесь я хочу перебрать все символы и удалить те, которые не являются алфавитами, цифрами, ‘-‘ или ‘_’ . Как только я удаляю недопустимый символ, я увеличиваю его до следующего символа. Но в этом случае я не вижу проблемы. Не могли бы вы уточнить?
4. Я не говорю, что есть проблема 🙂 Я просто говорю, что я ответил на ваш вопрос, только посмотрев на строку, которую вы упомянули, и не обратил никакого внимания на то, как она взаимодействует с циклом. Если у вас с этим нет проблем, это здорово 🙂
5. @MALLASARJSULEBHANVI: у вас должна возникнуть проблема с последовательными (разными) символами для удаления.
Ответ №2:
Попробуйте это :
#include <string>
#include <iostream>
std::string someFunctionToCorrectName(std::string amp;strName)
{
for(int nIndex = 0; nIndex < strName.size(); nIndex )
{
char currentChar = strName[nIndex];
if (
(currentChar >= 'a' amp;amp; currentChar <= 'z') ||
(currentChar >= 'A' amp;amp; currentChar <= 'Z') ||
(currentChar >= '0' amp;amp; currentChar <= '9') ||
currentChar == '-' || currentChar == '_')
{
continue;
}
strName.erase(nIndex, 1);
}
return strName;
}
int main() {
std::string str("Hel*lo*World");
std::cout << someFunctionToCorrectName(str) << "n"; //==> HelloWorld
return 0;
}