2013-11-30 3 views
1

Ниже приведен код проблемы.Нет преобразования из «const char» в «int»

#include <iostream> 
#include <cctype> 
using namespace std; 

void convertToUppercase(char *); 

int main() 
{ 
    char phrase[] = "characters and $32.98"; 

    cout << "The phrase before conversion is : " << phrase; 
    convertToUppercase(phrase); 
    cout << "\nThe phrase after conversion is : " << phrase << endl; 
    return 0; 
} 

void convertToUppercase(char *sPtr) 
{ 
    while (*sPtr != "\0") 
    { 
     if (islower(*sPtr)) 
      *sPtr = toupper(*sPtr); 

     cout << "sPtr (before) = " << sPtr; 
     sPtr++; 
     cout << "\nsPtr (after) = " << sPtr << endl; 
    } 
} 

Окно вывода показывает мне, что:

1>d:\sync files\converting lowercase letter to uppercase letters\converting lowercase letter to uppercase letters\main.cpp(19): error C2446: '!=' : no conversion from 'const char *' to 'int' 
1>   There is no context in which this conversion is possible 
1>d:\sync files\converting lowercase letter to uppercase letters\converting lowercase letter to uppercase letters\main.cpp(19): error C2040: '!=' : 'int' differs in levels of indirection from 'const char [2]' 

Где ошибка, которую я сделал? Я точно скопировал код из моей книги, но проблема все еще существует.

Извините, я не могу это найти. нужна помощь.

Благодарим за внимание.

+0

Ваша функция преобразования должна быть одним вызовом 'std :: transform' или циклом диапазона. Вам не нужно проверять, что он ниже. – chris

ответ

2
  1. Ваше состояние в то время как следует проверить *sPTR != '\0', "\0" имеет тип const char*
  2. Если toupper передается отрицательное значение, вы вызываете UB, поэтому убедитесь, что называть его static_cast<unsigned char> (Details)
  3. Вы не необходимо проверить islower, toupper уже делает это
  4. сделать вашу жизнь проще, используйте std::string:

    void convertToUpper (std::string& str) { 
    for (auto& v:str) 
        v = toupper(static_cast<unsigned char>(v)); 
    } 
    
3

Попробуйте

while (*sPtr != '\0') 

Вы также можете получить ошибку сегм для изменения строки постоянной

4

Простой, ваше сравнение неправильно.

while (*sPtr != "\0") 

должен быть

while (*sPtr != '\0') 
3

Состояние вашего while петли не так, вам нужно написать while(*sPtr != '\0') одинарные кавычки.

Объяснение: '\0' - это один символ, "\0" - константа строки, i. е. массив из двух символов в этом случае.

Есть также более короткие пути, чтобы написать ваше условие цикла:

  1. Вы можете просто использовать простой нуль вместо '\0': while(*sPtr != 0)

  2. Вы можете даже опустить сравнение, так как вы сравниваете к ноль: while(*sPtr)

2

Все, что вам нужно сделать, это изменить while (*sPtr != "\0") для while (*sPtr != '\0'). Вы пытаетесь сравнить символ с строкой. Я согласен с @chris, однако вам не нужно проверять, имеет ли он нижний регистр. Это просто беспорядочно, и это не уменьшит время работы вашего алгоритма.

3

Вы пытаетесь сравнить char с char const* (ну, действительно char const[2], но это только деталь). Вы, вероятно, имел в виду использовать

while (*sPtr != '\0') 

или

while (*sPtr) 

Обратите внимание, что использование islower() и toupper() не гарантируется работа: аргумент этих функций должен быть положительным, но char может иметь отрицательные значения ,Вы должны сначала преобразовать char в unsigned char:

toupper(static_cast<unsigned char>(*sPtr)) 

Тест на islower() не требуется: на не ниже char s toupper() просто возвращает аргумент. Опущение trst улучшает эффективность.

Смежные вопросы