2016-06-14 20 views
-2

これは文字列内のアルファベットの大文字と小文字を交換する簡単なコードです。それにはアルファベットだけが含まれていると仮定します。しかし、それは最初の文字列を出力するだけで、toupper()とtolower()関数にもかかわらず変更はありません。toupper()とtolower()が動作しない

#include<iostream> 
#include<ctype.h> 
using namespace std; 

void main() 
{ 
char sentence[30]; 
int i; 
cout << "enter a sentence: "; 
cin.getline(sentence, 30, '\n') 

for (i = 0; i != '\0'; i++) 
{ 
    if (isupper(sentence[i])) 
     sentence[i] = tolower(sentence[i]); 
    else 
     sentence[i] = toupper(sentence[i]); 
} 

cout << sentence; 
system("pause"); 

} 
+3

'I =「\ 0''あなたはこれが真実であることを期待しますか!?ループの前に 'sentence'を印刷しようとしましたか?なぜ 'std :: string'の代わりに' char [30] 'を使うのですか? –

答えて

0

forループはまったく呼び出されません。要素ではなく、インデックス変数iをチェックしています。

for (i = 0; i != '\0'; i++) 

for (i = 0; sentence[i] != '\0'; i++) 
0

あなたのループが一度も実行されていないする必要があります。

for (i = 0; sentence[i] != '\0'; i++) 

変更しても、あなたがまた整数0が文字に等しいと比較しますstd::transform

char casechange(char i) 
{ 
    if(isupper(i))return tolower(i); 
    else 
    return toupper(i); 
} 

std::transofrm(sentence.begin(),sentence.end(),sentence.begin(),casechange); 
0

を使用することができますstd:string

string str; 
getline(cin,str); 
for(int i=0;i<str.length();i++) 
{ 
.... 

を使用する方が良いだろうリテラル'\0'。これはあなたのループが決して入力されない理由です。

int i = 0; 
assert(i == '\0'); 

等価的にループの先頭。for (int i = 0; i != 0; ++i)。あなたが自分自身を大幅に節約することができ、

for (char *p = sentence; *p != '\0'; ++p) { 
    if (isupper(*p)) { 
     *p = tolower(*p); 
    } else { 
     *p = toupper(*p); 
    } 
} 

ただし、文字列を反復するためにポインタ変数を使用し、for (int i = 0; sentence[i] != '\0'; ++i)

のように

チェックsentence[i]または:あなたは、2つのいずれかを行うことを意味いずれかgetlineできれいにはるかに動作し、範囲ベースのforループで簡単に使用することができますstd::stringを使用して、トラブル:

std::string sentence; 
std::getline(std::cin, sentence); 
for (char& c : sentence) { 
    if (isupper(c)) { 
     c = tolower(c); 
    } else { 
     c = toupper(c); 
    } 
} 

または完全に機能的なアプローチを使用してループを取り除く:

std::for_each(sentence.begin(), sentence.end(), [](char& c) { c = isupper(c) ? tolower(c) : toupper(c); }); 
関連する問題