Преобразовать строку в C ++ в верхний регистр - PullRequest
245 голосов
/ 09 апреля 2009

Как можно преобразовать строку в верхний регистр. Примеры, которые я нашел из поиска в Google, касаются только символов.

Ответы [ 25 ]

10 голосов
/ 08 июня 2011

Пока вы в порядке с ASCII-only и можете предоставить действительный указатель на память RW, в C есть простая и очень эффективная однострочная строка:

void strtoupper(char* str)
{ 
    while (*str) *(str++) = toupper((unsigned char)*str);
}

Это особенно хорошо для простых строк, таких как идентификаторы ASCII, которые вы хотите нормализовать в том же регистре символов. Затем вы можете использовать буфер для создания экземпляра std: string.

10 голосов
/ 01 августа 2010
//works for ASCII -- no clear advantage over what is already posted...

std::string toupper(const std::string & s)
{
    std::string ret(s.size(), char());
    for(unsigned int i = 0; i < s.size(); ++i)
        ret[i] = (s[i] <= 'z' && s[i] >= 'a') ? s[i]-('a'-'A') : s[i];
    return ret;
}
9 голосов
/ 08 октября 2016
#include <string>
#include <locale>

std::string str = "Hello World!";
auto & f = std::use_facet<std::ctype<char>>(std::locale());
f.toupper(str.data(), str.data() + str.size());

Это будет работать лучше, чем все ответы, которые используют глобальную функцию toupper, и, вероятно, это то, что делает boost :: to_upper ниже.

Это потому, что :: toupper должен искать локаль - потому что она могла быть изменена другим потоком - для каждого вызова, тогда как здесь только штраф к вызову locale (). И поиск локали обычно включает взятие блокировки.

Это также работает с C ++ 98 после замены auto, использования нового неконстантного str.data () и добавления пробела для прерывания закрытия шаблона (от «>>» до «>>») как это:

std::use_facet<std::ctype<char> > & f = 
    std::use_facet<std::ctype<char> >(std::locale());
f.toupper(const_cast<char *>(str.data()), str.data() + str.size());
7 голосов
/ 09 апреля 2009
typedef std::string::value_type char_t;

char_t up_char( char_t ch )
{
    return std::use_facet< std::ctype< char_t > >( std::locale() ).toupper( ch );
}

std::string toupper( const std::string &src )
{
    std::string result;
    std::transform( src.begin(), src.end(), std::back_inserter( result ), up_char );
    return result;
}

const std::string src  = "test test TEST";

std::cout << toupper( src );
4 голосов
/ 17 декабря 2010
std::string value;
for (std::string::iterator p = value.begin(); value.end() != p; ++p)
    *p = toupper(*p);
2 голосов
/ 27 декабря 2013

Вот последний код с C ++ 11

std::string cmd = "Hello World";
for_each(cmd.begin(), cmd.end(), [](char& in){ in = ::toupper(in); });
2 голосов
/ 09 апреля 2009

попробуйте функцию toupper() (#include <ctype.h>). он принимает символы в качестве аргументов, строки состоят из символов, поэтому вам придется перебирать каждый отдельный символ, который при объединении составляет строку

0 голосов
/ 15 февраля 2012

ВСЕ эти решения на этой странице сложнее, чем они должны быть.

Сделай это

RegName = "SomE StRing That you wAnt ConvErTed";
NameLength = RegName.Size();
for (int forLoop = 0; forLoop < NameLength; ++forLoop)
{
     RegName[forLoop] = tolower(RegName[forLoop]);
}

RegName ваш string. Получите ваш размер строки не используйте string.size() в качестве фактического тестера, очень грязный и может вызвать проблемы. затем. самый простой for цикл.

помните, что размер строки также возвращает разделитель, поэтому используйте <, а не <= в тесте цикла. </p>

вывод будет: некоторая строка, которую вы хотите преобразовать

0 голосов
/ 09 апреля 2009

не уверен, что есть встроенная функция. Попробуйте это:

Включите библиотеки ctype.h ИЛИ cctype, а также stdlib.h как часть директив препроцессора.

string StringToUpper(string strToConvert)
{//change each element of the string to upper case
   for(unsigned int i=0;i<strToConvert.length();i++)
   {
      strToConvert[i] = toupper(strToConvert[i]);
   }
   return strToConvert;//return the converted string
}

string StringToLower(string strToConvert)
{//change each element of the string to lower case
   for(unsigned int i=0;i<strToConvert.length();i++)
   {
      strToConvert[i] = tolower(strToConvert[i]);
   }
   return strToConvert;//return the converted string
}
0 голосов
/ 24 января 2018

Мое решение (очистка 6-го бита для альфы):

#include <ctype.h>

inline void toupper(char* str)
{
    while (str[i]) {
        if (islower(str[i]))
            str[i] &= ~32; // Clear bit 6 as it is what differs (32) between Upper and Lowercases
        i++;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...