2017-01-31 11 views
-1

「各単語の最初の文字を大文字にする」というコードの一部がありますが、わかりません。 http://www.cplusplus.com/forum/beginner/117463/コードの一部で混乱しています

std::string str = x; 
str [0] = toupper (str[0]); 
std::for_each(str.begin()+1, str.end(), printChars); 
std::cout << str; 
return 0; 
} 

Void printChars(char& c) 
{ 
    if((*(&c - sizeof(char))) == " ") 
     c = toupper(c); 
} 

私はそれは常に資本への最初の文字を設定し、後の文字列の各1をチェックし理解しています。

しかし、なぜ彼は if((*(&c - sizeof(char))) == " ")を使用しないとどのように *&この場合には、空白の作業にそれを設定していますか?

+7

このプログラムはすべて間違っています。 – user2079303

+0

私はこのコードが前の文字がスペースであったかどうかを検出し、そうであれば現在の文字を大文字にする_tries_と推測します。しかし、たとえあなたが表示した例がUB(未定義の振る舞い)を示すのではない場合でも、配列の最初の要素(またはただ一つの文字)で呼び出すので、関数の使い方に注意する必要があります。実際にUBを展示するでしょう。編集:私はあなたがcharと '' char * 'を比較しているので、比較が行われていることが気になりました。 '==" "'これはほとんど同じではないでしょう。 –

+0

@AlgirdasPreidžius:コードは形式が不適切です。つまり、コンパイル不可能です(伝統的なC++コンパイラは、このようなエラーに対して単なる「警告」として知られていません)。 OPは明らかにオリジナルコードを巧みに再現することに失敗した(これは「ボイド」からも明らかである)。本当のコードがそこにあるということはありません。 – AnT

答えて

0

このコードは単純なポインタ演算を実行しています。あなたが求めているコードは、参照演算子&を使用して、変数cのアドレスを取得しています。次に、charの前にあるcharが空白かどうかを確認するためにcharのサイズの減算を実行して、toUpper()を呼び出します。したがって、たとえば

の場合、cのアドレスが100の場合は、&c - sizeof(char)がアドレス99の文字をチェックしています。*は、== " "を使用して変数の比較を可能にする変数を逆参照するために使用されます。

3

この場合どのように動作しますか?

これは機能しません。あなたが見せてくれるプログラムは、不正な形式であり、コンパイルされる可能性は低いです。

Void printChars(char& c) 

C++にはタイプVoidはありません。私はあなたが代わりにvoidを書くことを意図したと思う。

(some_char_value) == " " // expression simplified by me 

あなたはリテラル文字列の文字を比較しないことがあります。


しかし、なぜ、彼は彼にはないif((*(&c - sizeof(char))) == " ")

を使用しません。彼はif((*(&c - sizeof(char))) == ' ')を使用しています。

この場合、&はどのように機能しますか?

これはアドレス演算子です。ここでは、メモリアドレスcへの一時ポインタを得るために使用されます。

*この場合、どのように*動作しますか?

間接演算子です。ここでは、メモリロケーション&c - 1の文字を取得するために使用されます。 cによって参照される文字の直前のstrの文字です。

この場合、空白に設定しますか?

彼は引用符で囲まれた式に何も設定しません。 ==は等価比較演算子です。彼は&c - 1と文字リテラル' 'の値を比較します。

英語で:cより前の文字が空白かどうかをテストします。言い換えれば、彼はcが単語の最初の文字かどうかをテストします。

+0

' - sizeof(char)'の代わりに ' - 1'を使うべきです...標準で 'sizeof(char)== 1'が定義されているので同等ですが、後者は混乱して読みやすくなります –

関連する問題