toupper
は、const文字列を取りませんが、1文字のみを整数として扱います。
また、あなたのコード内のUBは、配列のアウトバウンドを読み取ろうとがあります:
名[20] =のtoupper(名[20])。
あなたが知っているように、配列は1からnではなく0からn-1に索引付けされています。また、も、あなたは正しいそれを書く場合のみ:上記の行が大文字に文字20日(指数19)に変換
name[19] = toupper(name[19]);
。そして、これはあなたが望むものではありません。すべての文字を大文字に変換したかったのです。 ...それはその文字の配列にはまり込むために、それは柔軟でよく設計だとサイズについては関係ありません良いです
char name[20];
cout << "what is your name?" << endl;
std::cin.get(name, 20);
// name[20] = toupper(name[20]); UB
for(int i(0); i < strlen(name); i++) // use strlen instead of specifying the length at compile-time
name[i] = toupper(name[i]);
std::cout << "Your name is " << name<< std::endl;
std::cin.sync(); // only for flushing the input buffer.
std::cout << "Enter name again: \n";
std::string strName;
std::getline(std::cin, strName);
for(int i = 0; i < strName.length(); i++)
strName[i] = toupper(strName[i]);
std::cout << "name: " << strName << std::endl;
'名[20]'したがって、範囲外の配列 'NAME'にアクセスしようとする - 呼び出す未定義の動作を。 –
あなたが入力する名前が20文字の記号の前に終わるとどうなりますか? – Rakete1111
'name [20] = toupper(name [20]);'は 'name'を大文字に変換し、' name'に新しい値を戻すと考えています。しかし、宣言の外側では、 'name [20]'はインデクス演算子の呼び出しで、インデックス20のcharにのみアクセスします(範囲外です)。 – VTT