c++ problem mit progrämmchen

villiboy

villiboy

Mitglied
hi leute,
hab mir gerade ein kleines programm geschrieben. leider geht es aber so nicht. wieso? finde den fehler nicht!! kann mir da wer helfen? wäre nett, danke!!!
Code:
#include <iostream>
#include <conio.h>
using namespace std;

int main(void){

char * str="ABC-129";
int i = 0;

while(str){
		   if((*(str+i))>='A' && (*(str+i))<='Z')
		   *(str+i)='X';
		   i++;
}

cout << str;
getch();
return 0;
}
 
Hallo,
der erste Fehler ist schonmal, dass conio.h nicht zum C++ Standard gehört. Das ist afaik eine windows lib.
 
Zunächst musst du, wie pinky schon angedeutet hat, conio.h und getch() entfernen. Es gibt ähnliche Befehle in der (N)Curses-Lib unter Unices, falls du sowas brauchst.

Dann kannst du nicht einfach in Speicherbereiche schreiben, die nicht schreibbar sind. str zeigt mit der Zuweisung auf den String in ein Speichersegment, auf das du keinen Zugriff hast (Segmentation fault). Also musst du selbst vorher Speicher allokieren und den String da rein packen bzw. den gleich per stdin holen.

Dann würde ich nicht i als Laufvariable benutzen, sondern gleich mit nem Pointer drüberrattern, dann musst nicht so viel schreiben.

Beispiel (ungetestet):
Code:
#include <iostream>

using namespace std;

int main(){
    char *str, *p;

    str = (char *)malloc(strlen(str));
    strcpy(str, "ABC-129");
    p = str-1;

    while(*(++p))
        if(*p >= 'A' && *p <= 'Z')
            *p = 'X';

    cout << str << endl;
    return 0;
}
 
Zuletzt bearbeitet:
thorus schrieb:
Beispiel (ungetestet):
Code:
    [...]
    char *str, *p;

    str = (char *)malloc(strlen(str));
    strcpy(str, "ABC-129");
   [...]
Die Allokierung ist hier sicher nicht korrekt, da str noch nicht gesetzt ist und somit auch keine bestimmte Laenge hat. Eine Defintion mit Deklaration wie
Code:
   char* str =  "ABC-129";
ist voellig korrekt und 'str' wird automatisch mit einem '\0' terminiert. Der eigentliche Fehler des urspruenglichen Programmes lag in der Kondition des 'while': Da 'str' gleichbedeutend mit '&str[0]' ist, aendert sich seinWert nicht, und die while - Schleife hat keine Abbruchbedingung.
'while ( str )...' waere korrekt. Oder eben auch die Zeiger-Version von thorus.
 
rikola schrieb:
Die Allokierung ist hier sicher nicht korrekt, da str noch nicht gesetzt ist und somit auch keine bestimmte Laenge hat. Eine Defintion mit Deklaration wie
Code:
   char* str =  "ABC-129";
ist voellig korrekt und 'str' wird automatisch mit einem '\0' terminiert.
Ups... naja, gings ums Prinzip. ;)
 
vielen dank für die hilfe aber das mit dem while(*(str+i)) klappt noch nicht ....
Code:
[B][...][/B]
using namespace std;

int main(void){

char * str="ABC-129";
int i = 0;

while(*(str+i)){
		   if((*(str+i))>='A' && (*(str+i))<='Z')
		   cout <<"Wieso?";		   
		   i++;
}

cout << str <<endl;
[B][...][/B]
 
Was genau klappt denn nicht? Bei mir kommt als Ergebnis
Wieso?Wieso?Wieso?ABC-129

Und das ist doch richtig.
 
upsss, ich möchte abc mit xxx überschreiben *gg*
 
Ich kann dir nicht genau erklaeren, wieso, aber Du musst str so definieren:
Code:
 char str[] = "ABC-129";
Dann kannst Du mit "str = 'X';"
Die ersten drei Zeichen ueberschreiben.
Ich nehme an, dass mit 'char* str' ein Zeiger auf einen konstanten Bereich im Speicher gesetzt wird, den Du nicht aendern darfst, waehrend Du mit 'char str[]' wirklich einen Speicherbereich reservierst, den Du auch aendern darfst.
mit std::string statt char* oder char[] passiert so etwas nicht!
 

Ähnliche Themen

C Code Hilfe!!! gesucht bei Dezimalzahl in Binärzahl for loop

Unix Webserver mit HTML Seite erstellen

String auf Konsole ausgeben

Funktion nicht gefunden

Ausführbare C-Datei von Mac OS auf Embedded Linux ausführen

Zurück
Oben