Wie greif ich auf die ASCII Tabelle zu???



  • Du gehst in einer Schleife durch den String, bis du die terminierende '\0' erreicht hast und lässt bei jedem Iterationsschritt den zugehörigen Zahlenwert anzeigen?



  • hmm ja, aber wie mach ich das dass dann genau nur die zahlen die ich brauch angezeigt werden, oder halt zurückgeliefert? also die vom h und vom a usw.
    ich bin erst seit einem monat am programmieren und wirklich nicht gut, also entschuldigt meine fragen...



  • Du solltest dich in ein gutes Buch/Tutorial einarbeiten. Wenn du wegen jeder "kleinigkeit" hier ein Topic aufmachst wirst du auf dauer keine ordentlichen antworten mehr erhalten. Eigeninitiative ist gefragt.

    Weist du denn was Schleifen sind? Und was Arrays sind?
    Die beiden sachen benötigst du dafür!
    Was hast du denn schon ausprobiert?

    schirrmie



  • Also, im prinzip weiss ich schon was schleifen sind, ich versteh nur einfach nicht wie das funktionieren soll, wenn man etwas hochzählt und dann auf eine zahl die darin vorkommt zugreifen soll, weil es zählt doch nur bis zum ende? ich bin nicht so der logische typ, ich glaub das ist mein hauptproblem.
    keine sorge ich werd nicht verlangen mein ganzes beispiel von euch lösen zu lassen. der kleine ansatz von vorhin, hat mich schon sehr weit gebracht.



  • Im Schleifenrumpf kannst du prinzipiell machen, was du willst - dabei kannst du natürlich auch den aktuellen Wert der Zählvariablen verwenden (z.B. als Index, um auf einzelne Buchstaben deines Strings zuzugreifen).



  • Ja das ist schon klar, aber wie 'stopp' ich die schleife an der stelle wo ich will?



  • Indem du die passende Abbruchbedingung definierst (wenn du jedes Zeichen eines Strings abarbeiten willst, bietet sich for(i=0;str[i]!='\0';++i) mac_was; an - '\0' ist die Stringende-Marke von C).



  • Aaah! Ja dann probier ich das mal so. Danke!!



  • char acString[6]="Hallo";
    
    for(int i=0; i <strlen(acString); i++){
    
     printf("%c -> %i",acString[i],(int)acString[i]); 
    
    }
    


  • BorisDieKlinge schrieb:

    char acString[6]="Hallo";
    
    for(int i=0; i <strlen(acString); i++){
     
     printf("%c -> %i",acString[i],(int)acString[i]); 
    
    }
    

    nope

    1. "for(int i=0; i <strlen(acString); i++)" ist in C nicht gültig
    2. Man nehme kein strlen in der Schleifbedingung, dann läuft die Schleife in O(n²) statt O(n), weil strlen immer wieder aufgerufen wird. [1]

    char acString[6]="Hallo";
    size_t i,len;
    
    len = strlen(acString);
    
    for(i=0; i < len; i++){
    
     printf("%c -> %i",acString[i],(int)acString[i]); 
    
    }
    

    ---

    [1] Die Diskussion hatten wir schon oft, in diesem Fall wird "i <strlen(acString);" nicht optimiert, weil der Compiler nichts über die Semantik einer gewissen Funktion strlen weiß und deswegen nicht annehmen darf/kann, dass sie immer den selben Wert zurückliefert, obwohl acString im Rumpf der Schleife nur lesend zugegriefen wird. Betrachte

    #include <stdio.h>
    #include <string.h>
    
    size_t mystrlen(const char *str)
    {
        printf("Wieder ein Aufruf von strlen\n");
        return strlen(str);
    }
    
    int main(void)
    {
        char world[] = "Hello World";
        int i;
        for(i=0; i < mystrlen(world); ++i)
            printf("world[%d] = %c\n", world[i], world[i]);
    
        return 0;
    }
    

    Egal welche Optimierungsstufe ich wähle (-O1, -O2, -O3, etc) ist die Ausgabe immer

    yanez@pselap08:~> ./strlen 
    Wieder ein Aufruf von strlen
    world[72] = H
    Wieder ein Aufruf von strlen
    world[101] = e
    Wieder ein Aufruf von strlen
    world[108] = l
    Wieder ein Aufruf von strlen
    world[108] = l
    Wieder ein Aufruf von strlen
    world[111] = o
    Wieder ein Aufruf von strlen
    world[32] =  
    Wieder ein Aufruf von strlen
    world[87] = W
    Wieder ein Aufruf von strlen
    world[111] = o
    Wieder ein Aufruf von strlen
    world[114] = r
    Wieder ein Aufruf von strlen
    world[108] = l
    Wieder ein Aufruf von strlen
    world[100] = d
    Wieder ein Aufruf von strlen
    


  • supertux schrieb:

    1. "for(int i=0; i <strlen(acString); i++)" ist in C nicht gültig

    auch nicht in C99?



  • es ist mir auch klar das strlen immer wieder augeurfen wird, aber es funktioniert trozdem! Die Performance spiel keine rolle in dem fall



  • 999 schrieb:

    supertux schrieb:

    1. "for(int i=0; i <strlen(acString); i++)" ist in C nicht gültig

    auch nicht in C99?

    doch, in C99 schon, aber da die wenigsten Compiler C99 vollständig unterstützen, sollte man das lieber (noch) nicht machen.

    BorisDieKlinge schrieb:

    es ist mir auch klar das strlen immer wieder augeurfen wird, aber es funktioniert trozdem! Die Performance spiel keine rolle in dem fall

    ne ne, Performance spielt nie eine Rolle 🙄... Wenn man nie dran denkt, wird man nie performanten Code schreiben können, das ist nur meine Meinung.



  • naja ich schreibe perfomanten code wenns notwendig ist... auserdem ist performance relativ...bei so einer primitiven for-schleife mit 10 iterationen, kann man den gschwindigkeits unterschied nich mal messen^^

    in deinem beispiel nehmen die printf's die meinse performance weg;)

    Aber las uns nich streiten.. 🤡

    P.S.: Schau dir mal meine threads hier in ANSI C an, vll. kannst mir ja helfen:)



  • supertux schrieb:

    999 schrieb:

    supertux schrieb:

    1. "for(int i=0; i <strlen(acString); i++)" ist in C nicht gültig

    auch nicht in C99?

    doch, in C99 schon, aber da die wenigsten Compiler C99 vollständig unterstützen, sollte man das lieber (noch) nicht machen.

    Was der Verbreitung von C99 sicher sehr zuträglich ist 😉

    Aber das ist ein anderes Thema...



  • Tim schrieb:

    Was der Verbreitung von C99 sicher sehr zuträglich ist 😉

    Aber das ist ein anderes Thema...

    klar, aber ich das können die Benutzer der Compiler nicht beeinflussen, sondern die Leute, die den Compiler schreiben 😉



  • BorisDieKlinge schrieb:

    naja ich schreibe perfomanten code wenns notwendig ist... auserdem ist performance relativ...bei so einer primitiven for-schleife mit 10 iterationen, kann man den gschwindigkeits unterschied nich mal messen^^

    Klar, für "Hobby-Anwendungen" stört der Unterschied vermutlich nicht - aber bei größeren Anwendungen (und vor allem - längeren Strings) ist es schon ein Unterschied, ob du quadratische oder lineare Laufzeit hast.



  • Ich klnge vielleicht pedantisch aber mir geht es hier nicht so sehr um den Geschwindigkeitsvorteil (den man bei längeren Strings auf jeden Fall hat) sondern ums Prinzip. Weil ich sehe, dass viele Leute sich nie Gedanken darüber machen, wie man etwas verbesseren kann, ohne viel Aufwand zu betreiben.

    Als ich Anfänger war, habe ich auch solche Sachen geschrieben, aber ich habe trotzdem immer versucht, selbst bei meinen "Hobbyprogrammenn" bzw. Lehrbeispielen, den Code zu performant wie möglich zu schreiben und dann guckte ich mir den Code ein Paar Wochen später wieder an, und merkte dabei, dass man noch etwas rausholen konnte. Ich denke, es gibt kleine Techniken, die man immer anwenden kann (außer es ist nötig dies nicht zu tun), wie z.B. ein strlen nicht in der Abbruchbedingung zu haben.


Anmelden zum Antworten