Zeichen umwandeln



  • NOCHMAL: atoi erwartet eine Zeichenkette, du übergibst ihr aber nur ein Zeichen.

    umgewandelt[i]=atoi ("zahlen[i]\0")
    

    "zahlen[i]\0" ist äquivalent zu "zahlen[i]" und dieses Strings enthält leider keine Zahl, somit liefert atoi 0 zurück.

    Dein Problem ist, du weiß nicht, wie man Fragen stellt. Du stellst deine Frage falsch und unvollständig, so dass man raten muss. Du hast ein char zahlen[6]; , angenommen so

    char zahlen[6] = "12345";
    

    willst du die Zahl 12345 umwandeln oder jede Ziffer einzeln? Wenn du die ganze Zahl umwandeln willst dann so:

    int umgewandelt = atoi(zahlen);
    

    willst du jede Ziffer einzeln umwandeln willst, dann so:

    int umgewandelt[5], i;
    for(i=0; i < 5; ++i)
      umgewandelt = zalen[i] - '0';
    

    zahlen[i] ist ein char. Ein char ist ein Integer, der (auf x86 Maschinen) 8 Bit Breit ist. Die Zeichenkodierung ist: man: ascii. Da der Integer Kodierungswert von '5' nicht 5 ist, kannst du '5' nicht sofort übernehmen. In der ASCII Kodierung kommt 5 vor 4 vor 3 ... vor 0. D.h. wenn ich dem Integer Kodierungswert von '5' den Kodierungswert '0' anziehe, erhalte ich 5-0 = 5, also habe ich eine Umwandlung von Teilmenge von ASCII -> natürliche Zahlen.



  • Ich will jede Ziffer einzeln umwandeln.

    Ich habe gesehen dass es so funktioniert.

    zahl[i]="1\0"
    
    umgewandelt[i]= atoi(zahl[i]);
    

    Da aber die Zahlen zb. so sind

    char zahl[6]="12345";
    

    habe ich gedacht das es auch so funktioniert

    i=0;
    
    umgewandelt[i]= atoi("zahl[i]\0")
    

    Hier ist ja zahl[0]=1 und hinten hängt noch \0. Somit wäre es ja auch ein string der so aussieht

    umgewandelt[0]=atoi("1\0");
    

    Andere Frage:

    Wenn ich habe:

    scanf("%d",&a);
    printf("Hallo");
    

    steht danach immer

    1
    Hallo
    

    Wäre es auch irgendwie möglich dass es so steht

    1 Hallo
    

    Bräuchte das scanf und printf in der selben Zeile.



  • hatschii schrieb:

    Ich will jede Ziffer einzeln umwandeln.

    Ich habe gesehen dass es so funktioniert.

    zahl[i]="1\0"
    
    umgewandelt[i]= atoi(zahl[i]);
    

    Kauf dir ein C Buch und lies es dir durch. Du hast offensichtlich große Wissenslücken, was den basis Datentypen angeht.

    1. Eine Zeichenkette "blablabla" hat automatisch ein \0 Terminierungszeichen. Damit brauchst du bei "1" nicht "1\0" zu schreiben. Im Speicher zieht es so aus: ("1") {'1', 0}, ("1\0") {'1', 0, 0} aber für C endet die Zeichenkette beim ersten '\0', unahängig davon, wieviel Speicher reserviert wurde. Wenn man das Terminierungszeichen vergisst, dann hat man 100% einen Buffer overflow, denn man würde über die Speichergrenzen hinaus lesen bzw. schreiben.

    1. zahl[i] ist ein char , KEINE Zeichenkette. Dein Compiler müsste dir halslaut warnen, dass du unkompatible Typen zuweist, wenn du zahl[i]="1\0"; schreibst. Also ignoriere die Warnungen des Compilers nicht.

    2. atoi(zahl[i]); ist falsch. Zum dritten Mal: atoi erwartet eine Zeichenkette (Zeiger auf eine Zeichenkette/Array von chars) und kein Zeichen. zahl[i] ist ein char . Der Compiler müsste da wieder halslaut warnen. atoi interpretiert zahl[i] als die Anfangsadresse der Zeichenkette und liest solange durch, bis \0 gefunden wird, was in Segfault enden kann.

    hatschii schrieb:

    Ich will jede Ziffer einzeln umwandeln.

    dann lies meinen letzten Beitrag nochmal neu, da hab ich eine Lösung gepostet.

    hatschii schrieb:

    Ich habe gesehen dass es so funktioniert.

    zahl[i]="1\0"
    
    umgewandelt[i]= atoi(zahl[i]);
    

    das geht so nicht, du hast nur Glück, dass das Programm nicht gleich abschmiert.

    hatschii schrieb:

    umgewandelt[i]= atoi("zahl[i]\0")
    

    liest du überhaupt deinen eigenen Code durch. Wenn du atoi wärst, was für einen Wert würdest du bei dieser Zeichenkette zurückgeben? 😕

    hatschii schrieb:

    Wäre es auch irgendwie möglich dass es so steht

    1 Hallo
    

    Bräuchte das scanf und printf in der selben Zeile.

    leider mit ANSI C nicht machbar. Wenn du OS-Spezifische Bibliotheken zur Steuerung des Terminals nimmst, dann geht das schon. Welches OS?



  • Ich habe gesehen dass du eine Lösung gepostet hast, mir ging es nur darum wieso es nicht auf die eine Art funktioniert.

    atoi braucht eine Zeichenkette.

    Meine Überlegung war jetzt, wenn ich aus

    zahl[5]="1234"

    nur die 2 haben will, könnte ich an die 2 noch '\0' dranhängen und dann wäre es nicht mehr nur ein Zeichen sondern eine Zeichenkette.

    Aber ist egal, eine Lösung ist vorhanden.

    Ich benütze Linux.

    1. Ich habe eine do-while Schleife. Die while-Bedingung ist bischen lang.
      Erst ab dem zweiten mal wenn die do-Schleife ausgeführt wird will ich etwas ausgeben.
      Muss ich da eine if-Schleife in die do-Schleife machen oder kann ich das auch irgendwie an das while anhängen.

    zb. so

    do
    {
    
    }while( ){
    
    }
    

    2)Ich habe

    scanf("%d %d %d %d", a,b,c,d)
    

    . Kann ich irgendwie sagen dass ab der 5 Zahl (wenn ich mehrere eingebe), die Zahl nicht mehr am Bildschirm erscheinen soll.

    3)Ich würde gerne Farbpunkte verwenden zb. 1=rot, 2=blau usw.
    Ist das irgendwie machbar.



  • hatschii schrieb:

    Meine Überlegung war jetzt, wenn ich aus
    zahl[5]="1234"
    nur die 2 haben will, könnte ich an die 2 noch '\0' dranhängen und dann wäre es nicht mehr nur ein Zeichen sondern eine Zeichenkette.

    damit würdeste aber die '3' vernichten. mach lieber zahl[1]-'0' (hat ja supertux schon vorgeschlagen).
    🙂



  • hatschii schrieb:

    1. Ich habe eine do-while Schleife. Die while-Bedingung ist bischen lang.
      Erst ab dem zweiten mal wenn die do-Schleife ausgeführt wird will ich etwas ausgeben.
      Muss ich da eine if-Schleife in die do-Schleife machen oder kann ich das auch irgendwie an das while anhängen.

    entweder mit ner if-anweisung (keine if-schleife), oder du macht das, was die schleife beim ersten durchlauf machen soll, vor der eigentlichen schleife.
    🙂



  • hatschii schrieb:

    Meine Überlegung war jetzt, wenn ich aus

    zahl[5]="1234"

    nur die 2 haben will, könnte ich an die 2 noch '\0' dranhängen und dann wäre es nicht mehr nur ein Zeichen sondern eine Zeichenkette.

    du kannst in einem Zeichen kein weiteres "reinquetschen" oder so. Weißt nicht, was du dir da vorstellst. C ist ganz einfach, man hält sich strikt an die Datentypen, ein zahl[2] ist ein char und du kannst es nicht einfach so daraus etwas anders machen.



  • hatschii schrieb:

    Hallo ich würde gerne 5 char Zeichen in int umwandeln.

    Poste doch mal ganz genau deine Anfangssituation, und welches Ergebniss du am Ende erhalten möchtest. So etwas wie:

    Ausgangspunkt:

    char zahl[5] = {'1', '2', '3', '4', '5'};
    

    erwartete Ausgabe:
    Zahl 1 = 1
    Zahl 2 = 2
    Zahl 3 = 3
    Zahl 4 = 4
    Zahl 5 = 5

    Lösung wäre dann:

    char		zahl[5] = {'1', '2', '3', '4', '5'};
    	int		i;
    
    	for(i = 0; i < 5; i++){
    		printf("Zahl %i = %i\n", (i+1), (int)(zahl[i] - '0'));
    	}
    


  • @guggstdu

    zahl[i] - '0'
    

    das passt eigentlich ich will aus einer eingegebenen char-Zahl eine int Zahl.
    Danke.

    Ich habe in einer do-while-Schleife eine doppelte for Schleife die auf Zahlen geprüft wird. Wenn eine Zahl doppelt vorkommt soll die do-Schleife noch mal durchlaufen werden.
    Die doppelte for Schleife kann ich ja nicht in die while()-Bedingung schreiben.
    Damit ich nicht jeden Wert einzeln in der while-Bedingung überprüfe bräuchte ich eine Hilfsvariable oder gäbe es noch eine andere Möglichkeit.

    Man kann ja am Anfang schreiben

    char zahlen[10]={0};
    

    Wie ist es aber wenn ich mitten im Programm das zahlen-Array auf 0 setzen will

    Wie kann ich in einem C-Programm rote Punkte auf der Konsole ausgeben.
    Ich bin mir nicht sicher ob Ansi-C das richtige Forum ist, wenn nicht wo kann ich diese Frage stellen.

    MfG



  • hatschii schrieb:

    Wie ist es aber wenn ich mitten im Programm das zahlen-Array auf 0 setzen will

    for(i = 0; i < 5; i++){ 
            zahl[i]=0; 
        }
    


  • Meinte

    int zahlen[5]={0};
    

    Gibt es keine einfachere Möglichkeit als die for-Schleife.



  • hatschii schrieb:

    Meinte

    int zahlen[5]={0};
    

    Gibt es keine einfachere Möglichkeit als die for-Schleife.

    für nullsetzen kannste auch

    memset(zahlen,0,sizeof(zahlen));
    

    schreiben. aber einfacher finde ich das nicht.



  • hatschii schrieb:

    Wie kann ich in einem C-Programm rote Punkte auf der Konsole ausgeben.
    Ich bin mir nicht sicher ob Ansi-C das richtige Forum ist, wenn nicht wo kann ich diese Frage stellen.
    MfG

    DOS und Win32-Konsole oder bei den Linuxern.



  • Wichtiger ist mir momentan Linux



  • hatschii schrieb:

    @guggstdu

    zahl[i] - '0'
    

    das passt eigentlich ich will aus einer eingegebenen char-Zahl eine int Zahl.
    Danke.

    Na toll, siehe Seite 1, mein erster Beitrag 😡 wozu geb ich mir hier die Mühe, wenn Leute nicht mal die Beiträge zu lesen scheinen?



  • @supertux

    Ich hatte deinen Beitrag gelesen. Ich hatte jedoch das atoi für die Umwandlung im Kopf und somit wollte ich versuchen das auf diese Art zu lösen. Ich wußte nicht dass das nur für Zeichenketten gilt und wollte es auf diese Art probieren.

    Letztendlich mußte ich diese Variante mit der Ascii-Subtrahierung hinnehmen. 😉


Anmelden zum Antworten