2013-11-24 1 views
0

Я пытаюсь преобразовать строку в верхний регистр в мою функцию файла заголовка. Однако, когда я пытаюсь сделать это я получаю сообщение об ошибке сказав «Не удается преобразовать из„класса String“к„полукокса“Изменить значение String в верхнем регистре в файле заголовка C++?

Вот мой код -.

#ifndef PATIENT_DEMO_CLASS 
#define PATIENT_DEMO_CLASS 

// system defined preprocessor statement for cin/cout operations 
#include <iostream.h> 
// header file from book 
#include "tstring.h" 
#include <algorithm> 
#include <string> 

class PatientDemographicInformation 
{ 
    private: 
    // patient's state 
    String patientState; 

    public: 
    // constructor 
    PatientDemographicInformation(String state); 

    // returns the patient's state in all capital letters 
    String getPatientState(); 
}; 
// assign values to constructor 
PatientDemographicInformation::PatientDemographicInformation(String state) 
{ 
    patientState = state; 
} 

String PatientDemographicInformation::getPatientState() 
{ 
    int i=0; 
// ------The line below this is where my error occurs-------- 
    char str[] = {patientState}; 
    char c; 
    while (str[i]) 
    { 
    c=str[i]; 
    putchar (toupper(c)); 
    i++; 
    } 
    return patientState; 
} 

Это просто раздел функция кода из . заголовочный файл «patientState» определяется в конструкторе, как String, дайте мне знать, если мне нужно размещать больше кода Пожалуйста, помогите в любом случае вы можете

Спасибо -... Джош

+0

Является ли ваше намерение напечатать строку в верхнем регистре в консоли/стандартный вывод, чтобы вернуть объект 'String' это копия 'patientState', но все прописные буквы или изменение' patientState' в текущем объекте? Также, пожалуйста, разместите конструкторы для 'String'. Нам нужно посмотреть, есть ли тот, который берет 'char *' или нет. – chwarr

+0

Что это за 'String'? Это не стандартный тип. – Johan

+2

Можете ли вы опубликовать определение для 'String', если оно не' std :: string'? –

ответ

2

Нет такого типа, как String в C++. Если вы имеете в виду C++/CLI, то я думаю, что тип возврата должен быть объявлен как String ^. Если это просто опечатка и вы имеете в виду класс зОго :: строка, то было бы проще написать

for (char c : patientState) putchar (toupper(c)); 
+1

У вас есть все шансы сделать это правильно! Почему вы делаете это неправильно? Аргумент 'toupper()' должен быть положительным значением или 'EOF', т. Е. Вы * имеете *, чтобы преобразовать' char' сначала в 'unsigned char'! Вы могли бы просто использовать 'for (unsigned char c: patientState) putchar (toupper (c));'! (конечно, использование этого кода предполагает, что 'String' имеет подходящие члены' begin() 'и' end() ') –

+0

@Dietmar Kühl это не так. Функция зависит от текущей локали. Из стандарта C: «Если аргумент является символом, для которого islower является истинным, и есть один или несколько соответствующих символов, как указано текущей локалью, для которой isupper истинно, функция toupper возвращает один из соответствующих символов (всегда то же самое для любого giv en locale), в противном случае аргумент возвращается без изменений ». –

+1

Проблема заключается в том, что вызов toupper (c) 'с отрицательным значением, то есть любой символ вне диапазона ASCII на платформах с 8-разрядным подписанным символом' char' имеет неопределенное поведение. Обратите внимание, что описанные платформы не совсем редки: среди них Linux (по крайней мере, на x86), SunOS и Windows. Соответствующая цитата в стандарте C (пункт 7.4 пункта 1) уже содержится в комментарии к одному из других ответов. –

0

Посмотрите на Std :: string :: c_str это может быть то, что вы искали

3

Вам не нужно конвертировать String в char[]: просто обработайте каждого персонажа на лету. Так как вы не указали точный тип и String достаточно отличается от std::string, что он может быть чем-то другим (в частности, первым символом верхнего регистра), неясно, какая операция может использоваться для доступа к символам внутри. Ни в коем случае вы не сможете инициализировать char str[], однако: как переменная, это массив статического размера с размером, полученным из инициализации.

Однако одна вещь, которую вы нужно сделать, это убедиться, что вы только передать действительные аргументы toupper(): эта функция потребляет только положительные значения, а особое значение EOF. Тем не менее, char может быть подписано, то есть, вы должны использовать toupper() так:

toupper(static_cast<unsigned char>(c)) 

где c является char вы получили откуда-то.