2012-01-31 4 views

ответ

10

Вы можете использовать toupper. Если вам нужно проверить, нужно ли сначала вводить вводный символ, вы можете использовать islower для его проверки.

+0

Можете также пропустить тест, так как 'toupper' не будет изменять символы нижнего регистра. –

+0

@KerrekSB Вот почему я сказал «если» - но исходный вопрос предполагает, что печать будет происходить только в том случае, если оригинал был ниже (и ничего не выводилось бы иначе). –

+0

Для записи 'toupper' зависит от текущей локали; если текст, введенный пользователем, будет храниться в какой-то строке Unicode (например, кодируется UTF-8), то 'toupper' не будет подходящим выбором. –

0

Вычесть 32 из значения ASCII, набранного в

+0

-1: ОП никогда не говорил, что это платформа ASCII. –

+0

На самом деле, мы оба ошибаемся, поскольку оператору нужно только преобразовать его в верхний регистр, если это действительная строчная буква ... Конечно, он не сказал, что ему нужно отобразить, если недействительно – Sparky

+0

Так что? Вы можете безопасно использовать 'toupper' для символов верхнего регистра. Фактически, поскольку эта функция уже выполняет все необходимые тесты, вам не нужно ничего делать. OP никогда не указывал, что происходит, когда вы * не * вводите строчный символ. –

0
if (c >= 'a' && c <= 'z') c &= 0xBF; 
+2

Это зависит от платформы и кодировки. –

+0

OP сказал, что самый эффективный, не самый общий. – schtever

+0

«наиболее эффективный» подразумевает «правильный». –

2

Это зависит от кодирования; если вы просто хотите обрабатывать ASCII, вы можете использовать тот факт, что английские буквы расположены в последовательности. Так что ваш код может выглядеть следующим образом:

bool isLowerCase(char ch) { 
    return ch >= 'a' && ch <= 'z'; 
} 

char toUpperCase(char ch) { 
    return (ch - 'a') + 'A'; 
} 

Если вы имеете дело со строками Unicode, вы, вероятно, следует рассмотреть возможность использования надлежащей библиотеки для этой работы, такие как ICU.

0

Если рассматривать метод как .ToUpper(), вы можете использовать этот метод, написанный мной:

char* ToUpper(char *lowerText) 
{ 
    int i; 

    const int length = strlen(lowerText); 

    char *ptrUpperCase = malloc(length + 1); 

    for(i = 0; i < length; i++) 
    { 
      if((lowerText[i] >= 0x61) && (lowerText[i] <= 0x7A)) 
        *(ptrUpperCase + i) = lowerText[i] - 0x20; 
      else 
        *(ptrUpperCase + i) = lowerText[i]; 
    } 

    *(ptrUpperCase + length) = 0x00; 

    return ptrUpperCase; 
} 

и назвав его использовать:

ToUpper("Apple2014"); 

он возвращает указатель см на «APPLE2014».

Надеюсь, это будет полезно;