0

こんにちは、戻り値の代わりにポインターを使用して、文字列を小文字に変換する関数を作成しようとしています。

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

しかし、ポインターから各文字を取得して tolower() を使用する方法、または文字列に含まれる文字数を取得する方法がわかりません

*in.length() 

sizeof(*in)/sizeof(char)

それのために働かないでください。前者はポインターの使用でエラーが発生し、後者は同じ戻り値を取得するsizeof(*in)ため、for ループを終了する方法さえわかりません。

4

4 に答える 4

1

ポインターで渡してポインター構文を処理する代わりに、文字列を参照で渡すことができ、通常の と同じように使用できますstd::string。ポインターを使用する必要がある場合は、次のいずれかを使用できます

in->length();

また

(*in).length();

.2 番目のケースでは、 よりも優先順位が高いため、括弧が必要です*

文字列を小文字に変換する場合は、組み込み関数<algorithm>と and を使用できます。

void makeLowerCase(std::string& in)
{
    std::transform(in.begin(), in.end(), in.begin(), ::tolower);
}
于 2016-01-27T15:33:12.763 に答える
0

C++ には、ポインターが指すオブジェクトのメンバーを取得するためのショートカットがあります。

in->length()

文字にアクセスするには、括弧を使用します。

(*in)[i]
于 2016-01-27T15:34:01.410 に答える
0

ポインターの場合は、ポインター演算子を使用します。それはそうでしょう

in->length();

ただし、裸のループは理想的な方法ではありません (正直なところ、ポインターを使用することもありません)。

より良い方法は、反復子を使用して文字列を反復処理し、そのように変換することです。

for (auto it=in->begin(); it!=in->end(); ++it) {
    *it = std::tolower(*it);
}
于 2016-01-27T15:34:16.810 に答える
0
*in.length() 

.よりも優先順位が高いため、 は機能しません*。括弧を使用します:

(*in).length() 

sizeof(*in)/sizeof(char)

と同じです

sizeof(*in) / 1

なぜならsizeof(char) == 1。、したがって、これは実装定義の文字列ではなく、オブジェクト自体sizeof(*in) == sizeof(std::string)のサイズを生成します。std::string


この情報は、イテレータ、for_each、およびラムダと組み合わせて、関数のないきれいな 3 行を作成します。

#include <cctype>

...

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

ノート:

  • 代わりに参照を使用してください。見栄えが良く、使いやすくなっています。ポインターは、C++ で低レベルの処理を行う場合、またはポインターを切り取る方法がない場合にのみ使用してください。
于 2016-01-27T15:31:26.697 に答える