ошибка C2137: пустая символьная константа в c

#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;
}