2016-01-27 4 views
0

Здравствуйте, я пытаюсь написать функцию, которая преобразует строку в нижний регистр с помощью указателя вместо возвращаемого значения.Получить char от указателя на строку

void makeLowerCase(std::string* in){ 
//for loop tolower(char from *in);} 

, но я понятия не имею, как получить каждый символ из моего указателя использовать ToLower() с, или как получить, сколько символов в строке, как

*in.length() 

и

sizeof(*in)/sizeof(char) 

не работает. В первом случае я получаю сообщение об ошибке при использовании указателя, последний получает одинаковое возвращаемое значение для sizeof(*in), поэтому я даже не знаю, как закончить цикл for.

+0

Почему бы не использовать ссылку вместо этого? 'void makeLowerCase (std :: string & in)' – DeathTails

+0

Если вы используете C++, вы должны использовать библиотеки, указанные внутри вашей функции, но ... вне этого оператора, передайте адрес 'std :: string' а затем 'in' будет указателем, которым вы можете манипулировать. – Fallenreaper

+0

Используйте '->' вместо '.' при работе с указателями. –

ответ

0

C++ имеет ярлык, чтобы получить элемент объекта, на который указывает указатель :

in->length() 

Для доступа символов, используйте круглые скобки:

(*in)[i] 
0
*in.length() 

не работает, потому что . имеет более высокий приоритет, чем *. Используйте круглые скобки:

(*in).length() 

sizeof(*in)/sizeof(char) 

такая же, как

sizeof(*in)/1 

потому sizeof(char) == 1. sizeof(*in) == sizeof(std::string), поэтому это дает размер самого объекта std::string, а не строку символов, которая определена в соответствии с реализацией.


Эта информация, в сочетании с итераторы, for_each и лямбды, сделать довольно три вкладыша без каких-либо функций:

#include <cctype> 

... 

for (char& c : str) 
    c = std::tolower(c); 

Примечания:

  • Вместо этого используйте ссылки. Они выглядят лучше и легче использовать. Указатели должны использоваться только на C++ для низкоуровневых материалов или когда нет возможности их вырезать.
1

Вместо того чтобы проходить по указателю и иметь дело с синтаксисом указателя, вы можете передать строку по ссылке, а затем вы можете использовать ее так же, как обычный std::string. Если вы должны использовать указатель, то вы можете использовать либо

in->length(); 

или

(*in).length(); 

Скобки необходимы во втором случае, как . имеет более высокий приоритет, то *.

Как для преобразования строки в нижний регистр вы можете использовать встроенные функции от <algorithm> и и что даст вам

void makeLowerCase(std::string& in) 
{ 
    std::transform(in.begin(), in.end(), in.begin(), ::tolower); 
} 
0

Для указателей вы должны использовать оператор указателя. Так что это будет

in->length(); 

Однако голая петля не является идеальным способом (и не использует указатели, если честно).

Лучшим способом было бы использовать итераторы для итерации по строке и преобразования ее таким образом.

for (auto it=in->begin(); it!=in->end(); ++it) { 
    *it = std::tolower(*it); 
} 
+0

Это должно быть '++ it' –

+0

К сожалению. Ты прав. –

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