c++ problem mit progrämmchen

Diskutiere c++ problem mit progrämmchen im C/C++ Forum im Bereich Programmieren unter Linux/Unix; 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?...

  1. #1 villiboy, 23.01.2006
    villiboy

    villiboy Mitglied

    Dabei seit:
    07.04.2005
    Beiträge:
    37
    Zustimmungen:
    0
    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;
    }
     
  2. pinky

    pinky König

    Dabei seit:
    11.08.2004
    Beiträge:
    795
    Zustimmungen:
    0
    Hallo,
    der erste Fehler ist schonmal, dass conio.h nicht zum C++ Standard gehört. Das ist afaik eine windows lib.
     
  3. #3 thorus, 23.01.2006
    Zuletzt bearbeitet: 23.01.2006
    thorus

    thorus GNU-Freiheitskämpfer

    Dabei seit:
    03.11.2002
    Beiträge:
    757
    Zustimmungen:
    0
    Ort:
    Passau, Niederbayern
    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;
    }
     
  4. rikola

    rikola Foren Gott

    Dabei seit:
    23.08.2005
    Beiträge:
    2.133
    Zustimmungen:
    0
    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.
     
  5. thorus

    thorus GNU-Freiheitskämpfer

    Dabei seit:
    03.11.2002
    Beiträge:
    757
    Zustimmungen:
    0
    Ort:
    Passau, Niederbayern
    Ups... naja, gings ums Prinzip. ;)
     
  6. #6 villiboy, 23.01.2006
    villiboy

    villiboy Mitglied

    Dabei seit:
    07.04.2005
    Beiträge:
    37
    Zustimmungen:
    0
    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]
    
     
  7. rikola

    rikola Foren Gott

    Dabei seit:
    23.08.2005
    Beiträge:
    2.133
    Zustimmungen:
    0
    Was genau klappt denn nicht? Bei mir kommt als Ergebnis
    Wieso?Wieso?Wieso?ABC-129

    Und das ist doch richtig.
     
  8. #8 villiboy, 24.01.2006
    villiboy

    villiboy Mitglied

    Dabei seit:
    07.04.2005
    Beiträge:
    37
    Zustimmungen:
    0
    upsss, ich möchte abc mit xxx überschreiben *gg*
     
  9. rikola

    rikola Foren Gott

    Dabei seit:
    23.08.2005
    Beiträge:
    2.133
    Zustimmungen:
    0
    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!
     
Thema:

c++ problem mit progrämmchen

Die Seite wird geladen...

c++ problem mit progrämmchen - Ähnliche Themen

  1. Probleme mit WinSCP und Rechten

    Probleme mit WinSCP und Rechten: Hallo. Ich habe vor ein paar Tgen meinen ersten Ubuntu 16.04 vServer bei 1&1 bestellt, gemäß dem sicheren Umgang damit, habe ich erstmal den SSH...
  2. Bootproblem

    Bootproblem: Hallo Ein PC (i686 mit Debian unstable, nox) hat Bootprobleme (will heißen ist erfolgt keine Grafikausgabe. was ich bisher gemacht habe: HDD an...
  3. Crontab und Scripts - Problem

    Crontab und Scripts - Problem: Hallo Zusammen Ich habe ein Script welches mittels Cronjob ausgeführt werden soll. Gemäss Log wird es auch ausgeführt, jedoch passiert nichts:...
  4. Problem bei der installation einer Sun Netzwerkkarte

    Problem bei der installation einer Sun Netzwerkkarte: Guten Morgen zusammen, beim installieren einer zusätzlichen Netzwerkkarte habe ich ein Problem. Die Karte wird nicht automatisch installiert. Es...
  5. Problem bei der Vergabe von Sciherheitsinformationen auf eine Freiagbe

    Problem bei der Vergabe von Sciherheitsinformationen auf eine Freiagbe: Liebe Community, zurzeit arbeite ich an eine Active Directory Domäne die mittels Samba läuft. Dazu habe ich einen AD DC auf Debian 8.7 mit Samba...