2017-09-09 16 views
0

次のプログラムでは、文章を大文字に変換しないのはなぜですか?あなたが大文字に各文字を変換する必要があり大文字に変更することはできません

#include <iostream> 
#include <string> 
using namespace std; 

int main() 
{ 
    char name[20]; 
    cout << "what is your name?" << endl; 
    system("pause"); 
    cin.get(name, 20); 
    name[20] = toupper(name[20]); 
    cout << "Your name is " << name<< endl; 
    system("pause"); 
} 
+4

'名[20]'したがって、範囲外の配列 'NAME'にアクセスしようとする - 呼び出す未定義の動作を。 –

+0

あなたが入力する名前が20文字の記号の前に終わるとどうなりますか? – Rakete1111

+2

'name [20] = toupper(name [20]);'は 'name'を大文字に変換し、' name'に新しい値を戻すと考えています。しかし、宣言の外側では、 'name [20]'はインデクス演算子の呼び出しで、インデックス20のcharにのみアクセスします(範囲外です)。 – VTT

答えて

0

name[20]は(あなたの場合には、あまりにも無効なインデックスである、)インデックス20を取得します。

各文字を大文字に変換するために配列をループすることができます。あなたも、このスレッドを見るべき

for (int i = 0; name[i] != '\0'; i++){ 
    name[i] = toupper(name[i]); 
} 

Why is "using namespace std" considered bad practice?

+0

'strlen'は、ヌル文字を検索して文字数(長さ)を数えるために、配列全体を別々に丸めます。ループ状態で 'strlen'が呼び出された場合、この関数は条件がチェックされるたびに呼び出され、このコードの時間複雑度は' O(N) 'から' O(N^2) '(' N 'は配列の長さです)。 –

+0

ループの前に呼び出しを行い、 'strlen'の結果を保存しても、配列全体(O(N))に2回ラウンドが得られますが、私のコードでは1つだけになります。 –

0

この配列の開始インデックスが0の場合は、[20]が存在しない名前を付けます。

0

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; 
  • 使用クラスstring
  • :だからここ

    は一例です

-1
#include <iostream> 
#include <string> 
using namespace std; 
int main(){ 
char name[20]; 
cout << "what is your name?" << endl; 
system("pause"); 
cin.get(name, 20); 
for(int i=0;i<20;i++){ 
name[i]=toupper(name[i]); 
} 
cout << "Your name is " << name<< endl; 
system("pause"); 

}

+0

ようこそStackOverflowへ!あなたの投稿を再編集し、コードの説明を追加してください:あなたは何をしましたか/追加/変更しましたか?また、コードを適切にフォーマットしてください。 – juzraai

0

を変更します大文字には、std::transformを使用することができます。

std::string test_string = "this is a test"; 
std::cout << "Before modifications: " << test_string << "\n"; 
std::transform(test_string.begin(), test_string.end(), 
       test_string.end(), 
       std::toupper); 
std::cout << "After modifications: " << test_string << "\n"; 
関連する問題