C++ Problem mit Feld und Adresse

Paulmann

Cadet 4th Year
Registriert
Sep. 2005
Beiträge
100
Erstmal hallo an alle,

ich bin jetzt seit ein paar Tagen dabei C++ zu lernen.
Benutze dazu ein Buch un bin momentan bei Strings,Feldern, Adressen.

Muss gerade eine Funktion schreiben, die prüft ob Kleinbuchstaben in einem String vorhanden sind, diese in Großbuchstaben umwandelt und die Anzahl der Umwandlungen angibt.

Soweit so gut, ist ja eigtl. nix großes dabei.

Habe dann mein Programm geschrieben:
#include "stdafx.h"
using namespace std;
int upstring(char *string,15)
{
int i=0;
for(i=0;i<15;i++)
{
int anzahl=0;
if(islower(string))
{ string=toupper(string);
anzahl++;
}
return(anzahl);
}
}
int _tmain(int argc, _TCHAR* argv[])
{
char kette[15];
int anz,ende;
cin.getline(kette,15);
anz=upstring(kette);
cout << kette << endl;
cin >> ende;
return 0;
}



Ich weiß man kann die "Hochtickung" des Strings auch mit der Adresse lösen: string++, aber ich wollte diesmal diese Variante ausprobieren, funktioniert aber leider nicht.

kapitel 11.1.cpp(6) : error C2059: Syntaxfehler: 'Konstante'


Die Lösung in meinem Buch lautet wie folgt:

#include "stdafx.h"
using namespace std;
int upstring(char *s)
{
int a=0;

while(*s)
{
if(islower(*s))
{
*s=toupper(*s);
a++;
}
s++;
}
return(a);
}

int _tmain(int argc, _TCHAR* argv[])
{
char quelle[160];
int umw,ende;

cout << " Bitte String eingeben:";
cin.get(quelle,160);
umw=upstring(quelle);
cout << "Umgewandelter String :\"" << quelle << "\" . \n";
cout << "Umwandlungen:" << umw << endl;
cin >> ende;
return 0;
}

Okay, hier wird eine while-Schleife benutzt und halt die Adresse um die größer der Variablen "hochgetickt".
Aber mein Programm sollte doch auch funktionieren, oder nicht?

Was mache ich falsch?
Danke schonmal im Voraus für eure Hilfe!!

MfG Paulmann
 
Code:
int upstring(char *string)
{
} // oder:
int upstring(char string[15])
{
}
sollten beide funktionieren


und noch was:
du musst
Code:
int anzahl=0;
// und:
return(anzahl);
ausserhalb der for-schleife schreiben, da sonst anzahl immer neu erstellt wird, =0 gesetzt, um eins erhöht (falls lower) und dann wieder gelöscht und du beim ersten schleifendurchlauf wieder aus upstring() rausspringst
 
Danke für deine Antwort,
habe jetzt mal den unnötigen Parameter "15" aus der Funktion rausgeholt(da hab ich etwas ausprobiert^^) und die Anzahl-Variable aus der for-Schleife genommen. Das ist mir gar nicht aufgefallen, kenne zwar natürlich die Thematik, aber darauf scheine ich noch zu wenig zu achten :-).

Hab jetzt zwar noch ein Logikproblem drin, aber das bekomme ich hin, dafür programmiere ich ja :-).

Nochmals danke für deine Antwort!!


Achja jetzt fällt mir gerade noch was ein.
Mein Logikproblem besteht darin, dass die Schleife ja erst bei 15 aufhört, dass Problem umgeht das Buch ja indem sie die Adresse "hochtickt".
Aber in meinem Programm hört, sie ja nicht vorher auf und findet dann keinen Wert mehr, ich bräuchte also die aktuelle Länge von dem String der vorher eingegeben wurde, oder ich bräuchte eine Funktion, die prüft ob an dieser Stelle noch etwas steht und wenn nicht mit break rausspringt.

Dafür wollte ich Len=size_t strlen(const char*string) verwenden, bekomme hierbei jedoch immer die Fehlermeldung, dass size_t nicht als Ausdruck benutzt werden darf.

Edit:

Ich merke, ich kanns nicht mehr erklären, muss erstmal was essen.

So sieht mein Programm jetzt aus:

using namespace std;
int upstring(char *string)
{
int i=0,anzahl=0;

for(i=0;i<15;i++)
{
if(islower(string))
{
string=toupper(string);
anzahl++;
}

}
return(anzahl);
}
int _tmain(int argc, _TCHAR* argv[])
{
char kette[15];
int anz,ende;
cin.getline(kette,15);
anz=upstring(kette);
cout << kette << endl;
cin >> ende;
return 0;
}
 
Zuletzt bearbeitet:
Zu deiner Fehlermeldung:
Du musst Len = strlen(deinstring); schreiben. size_t ist nur der Rückgabewert, der allerdings in int umgewandelt werden kann.
 
size_t ist wie alle Namen mit angehängten _t ein Typ. In dem Fall einfach ein anderer Name für int bzw. unsigned int, weiß ich jetzt nicht genau. Daher kannst du die beiden Typen einfach austauschen. Ob solche typedefs sinnvoll sind, muss jeder für sich entscheiden.

Code:
Len=size_t strlen(const char*string)
entspräche dann einfach
Code:
Len=int strlen(const char*string)

was natürlich nicht funktioniert, da der Compiler an der Stelle einen Wert erwartet und keine Typenbezeichnung.

Code:
size_t strlen(const char*string)
strlen ist eine Funktion und size_t einfach ihr Rückgabewert.
 
Zurück
Oben