2016-06-14 13 views
-2

Dies ist ein einfaches Stück Code, um die Fälle von Alphabeten in einer Zeichenfolge auszutauschen. Angenommen, es enthält nur Alphabete und sonst nichts. Aber es druckt nur die ursprüngliche Zeichenkette, ändert nichts daran trotz der Funktionen toupper() und tolower().toupper() und tolower() funktioniert nicht

#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'' wann erwarten Sie diese wahr sein!? Haben Sie versucht, Satz vor der Schleife zu drucken? Warum wählst du 'char [30]' anstelle von 'std :: string'? –

Antwort

0

Die for-Schleife wird überhaupt nicht aufgerufen. Sie überprüfen die Indexvariable i, nicht das Element.

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

sollte

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

Ihre Schleife nicht einmal ausgeführt wird.

ändert es zu

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

Auch wäre es besser, std:string

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

Sie auch 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

Die ganze Zahl 0 den Charakter gleich vergleichen verwenden könnten verwenden wörtlich '\0'. Aus diesem Grund wird Ihre Schleife nie eingegeben.

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

Die Spitze der Schleife for (int i = 0; i != 0; ++i) äquivalent. Sie entweder bedeuten, eines von zwei Dingen zu tun:

prüfen sentence[i] wie in for (int i = 0; sentence[i] != '\0'; ++i)

Oder eine Zeigervariable verwenden, um über den String

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

jedoch iterieren, können Sie sich eine Menge sparen for-Schleifen Probleme durch eine std::string verwendet, die mit getline viel sauberer arbeitet und einfach mit der Nutzung ermöglicht bereichsbasierte:

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

Oder die Schleife ganz den funktionalen Ansatz loszuwerden:

std::for_each(sentence.begin(), sentence.end(), [](char& c) { c = isupper(c) ? tolower(c) : toupper(c); }); 
Verwandte Themen