1. #1
    Lieutenant
    Dabei seit
    Jul 2008
    Beiträge
    937

    [C] Stringlänge im Puffer zurückgeben

    Hallo,
    Ziel meines neuen Programms ist es einen char-Array von Anfang bist Ende mit Charmatching zu durchlaufen und die Anzahl der Chars zurückzugeben die durchlaufen wurden bis in dem String ein "a" vorkommt.

    Code:
    int main () {
        char puffer[30] = {"123456789a"};
        char key = "a";
    
        int i;
        for (i=0; puffer[i] != key; i++);
        printf ("%d ", i+1);
        return 0;
    }
    Ich hätte damit gerechnet dass das Programm 10 anzeigt, stattdessen zeigt es 345 an. Die zahl die angezeigt wird variiert mit der Änderung der Puffergröße, aber nach einem nicht nachvollziebaren Muster. Außerdem gibt der Debugger eine Warnung aus:
    Line|3|:warning: initialization makes integer from pointer without a cast|
    damit ist der key-char gemeint. Weiß aber nicht was der von mir will. Die Fehlermeldung würde mich auch garnicht stören wenn das Programm laufen würde...
    GA870A-UD3, 2x2GB RAM, OCZ Vertex2E60,
    X6 1055T + Scythe Mugen B,
    Palit GTX 275 + Scythe Kama Stay + 2x Scythe Slip Stream,
    Enermax Liberty 400W @ max. 520W + BeQuiet Silent Wings USC,
    CM690II+, W7pro
    ultra silent

  2. Anzeige
    Logge dich ein, um diese Anzeige nicht zu sehen.
  3. #2
    Lt. Commander
    Dabei seit
    Jul 2001
    Ort
    D:\BW\Stuttgart
    Beiträge
    2.012

    [C] AW: Stringlänge im Puffer zurückgeben

    char key = "a"; geht nicht wirklich. Da versuchst du, auf einen char einen string zu schreiben, was ja in C ein Pointer auf die Anfangsadresse ist.

    Diese Fehlermeldung kriegst du weg, indem du char key = 'a'; schreibst.
    Vielleicht löst sich das ganze Problem dann auch in Wohlgefallen auf.
    System: Intel C2Q 8300, Asus P5QL-E, 4GB, HD4670, Samsung 830 256GB SSD, Samsung F1 640GB, Samsung 500GB, Windows 7 x64 Professional, HP ZR 2440w.
    Multimedia: Yamaha RX-V473, 2x Canton GLE 490, Asus O!Play Air, Panasonic DMR EH 495 an einem Toshiba Regza 26A300P. Storage übernimmt ein Synology DS-211j mit 2x 3TB im RAID1.
    + Richtig Posten + Probleme mit Partitionen? + Du suchst einen Dateimanager? + Probleme mit Hardware sicher entfernen? +

  4. #3
    Lieutenant
    Ersteller dieses Themas

    Dabei seit
    Jul 2008
    Beiträge
    937

    [C] AW: Stringlänge im Puffer zurückgeben

    Jetzt funktioniert's, Danke =)
    GA870A-UD3, 2x2GB RAM, OCZ Vertex2E60,
    X6 1055T + Scythe Mugen B,
    Palit GTX 275 + Scythe Kama Stay + 2x Scythe Slip Stream,
    Enermax Liberty 400W @ max. 520W + BeQuiet Silent Wings USC,
    CM690II+, W7pro
    ultra silent

  5. #4
    Lieutenant
    Dabei seit
    Mär 2006
    Beiträge
    721

    [C] AW: Stringlänge im Puffer zurückgeben

    Zitat Zitat von foggy80 Beitrag anzeigen
    Jetzt funktioniert's, Danke =)
    Jetzt - in Deinem speziell hier vorgetragenen Fall - vielleicht. Die Implementierung ist in der aktuellen (und selbst in der korrigierten, syntaktisch korrekten) Form nicht für alle Eingabewerte ausreichend durchdacht und abgesichert!

    Code:
    int main () {
        char puffer[30] = {"123456789a"};
        char key = 'a';
    
        int i;
        for (i=0; puffer[i] != key; i++);
        printf ("%d ", i+1);
        return 0;
    }
    Stell Dich schon einmal auf eine Zugriffsverletzung ein, wenn <key> nicht in <puffer> vorkommt!
    Geändert von XunnD (02.12.2009 um 02:49 Uhr)

  6. #5
    Lieutenant
    Ersteller dieses Themas

    Dabei seit
    Jul 2008
    Beiträge
    937

    [C] AW: Stringlänge im Puffer zurückgeben

    Im Endeffekt wollte ich die ganze Sache nach einem '\0' Suchen lassen.

    Code:
    # include <stdio.h>
    
    int main () {
        char puffer[1000];
        scanf ("%s", puffer);
        fflush (stdin);
        char key = '\0';
    
        int i;
        for (i=0; puffer[i] != key; i++);
        printf ("%d ", i);
        return 0;
    }
    Gibt es denn Fälle in denen ein String nicht mit einem '\0' beendet wird? Ich war mir Anfangs nur unsicher ob das so klappt mit dem '\0', aber scheinbar geht's.
    Geändert von foggy80 (02.12.2009 um 08:06 Uhr)
    GA870A-UD3, 2x2GB RAM, OCZ Vertex2E60,
    X6 1055T + Scythe Mugen B,
    Palit GTX 275 + Scythe Kama Stay + 2x Scythe Slip Stream,
    Enermax Liberty 400W @ max. 520W + BeQuiet Silent Wings USC,
    CM690II+, W7pro
    ultra silent

  7. #6
    claW.
    Gast

    [C] Re: Stringlänge im Puffer zurückgeben

    Zitat Zitat von foggy80 Beitrag anzeigen
    Gibt es denn Fälle in denen ein String nicht mit einem '\0' beendet wird? Ich war mir Anfangs nur unsicher ob das so klappt mit dem '\0', aber scheinbar geht's.
    funktioniert auch, aber ich würde es dir nicht empfehlen. was passiert wirst du dir ja denken können. dazu kannst du dir mal funktionen wie strncat ansehen, denn diese arbeiten jeweils ohne irgendwo ein \0 reinzuschieben oder anzuhängen.

  8. #7
    Lieutenant
    Ersteller dieses Themas

    Dabei seit
    Jul 2008
    Beiträge
    937

    [C] AW: Stringlänge im Puffer zurückgeben

    Zitat Zitat von claW. Beitrag anzeigen
    funktioniert auch, aber ich würde es dir nicht empfehlen. was passiert wirst du dir ja denken können. dazu kannst du dir mal funktionen wie strncat ansehen, denn diese arbeiten jeweils ohne irgendwo ein \0 reinzuschieben oder anzuhängen.
    Code:
    int strzahl (char *str) {
        char key = '\0';
    
        int i;
        for (i=0; str[i] != key; i++);
        printf ("String besteht aus %d Zeichen", i);
        return 0;
    }
    
    int main () {
        char *oordner = {"12345"};
        char *uordner = {"12345678"};
        char uadresse[300];
        strncpy (uadresse, oordner, 6);
        strncat (uadresse, uordner, 8);
        printf ("%s\n", uadresse);
        strzahl (uadresse);
        return 0;
    }
    also bei mir funktionierts.
    Geändert von foggy80 (02.12.2009 um 13:12 Uhr)
    GA870A-UD3, 2x2GB RAM, OCZ Vertex2E60,
    X6 1055T + Scythe Mugen B,
    Palit GTX 275 + Scythe Kama Stay + 2x Scythe Slip Stream,
    Enermax Liberty 400W @ max. 520W + BeQuiet Silent Wings USC,
    CM690II+, W7pro
    ultra silent

  9. #8
    claW.
    Gast

    [C] Re: Stringlänge im Puffer zurückgeben

    code:
    Code:
    #include <iostream>
    
    using std::cout;
    using std::endl;
    
    int main( int argc, char **argv, char **env )
    {
      char str[50];
    
      strncpy( str, "abc", 3 );
      strncat( str, "def", 3 );
    
      cout << str << endl;
    
      system( "pause" );
    
      return 0;
    }
    ausgabe:
    Code:
    abc╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠&
    úx©*↕def
    Drücken Sie eine beliebige Taste . . .

  10. #9
    Lieutenant
    Ersteller dieses Themas

    Dabei seit
    Jul 2008
    Beiträge
    937

    [C] AW: Stringlänge im Puffer zurückgeben

    von c++ versteh ich keine Bohne, also versteh ich das nicht.
    GA870A-UD3, 2x2GB RAM, OCZ Vertex2E60,
    X6 1055T + Scythe Mugen B,
    Palit GTX 275 + Scythe Kama Stay + 2x Scythe Slip Stream,
    Enermax Liberty 400W @ max. 520W + BeQuiet Silent Wings USC,
    CM690II+, W7pro
    ultra silent

  11. #10
    claW.
    Gast

    [C] Re: Stringlänge im Puffer zurückgeben

    Code:
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    int main()
    {
      char str[50];
    
      strncpy( str, "abc", 3 );
      strncat( str, "def", 3 );
    
      printf( "%s\r\n", str );
    
      system( "pause" );
    
      return 0;
    }
    verstehst du das jetzt besser?

  12. #11
    Lieutenant
    Ersteller dieses Themas

    Dabei seit
    Jul 2008
    Beiträge
    937

    [C] AW: Stringlänge im Puffer zurückgeben

    die anzahl der chars bei strncpy muss 4 sein, sonst funktioniert es nicht.
    GA870A-UD3, 2x2GB RAM, OCZ Vertex2E60,
    X6 1055T + Scythe Mugen B,
    Palit GTX 275 + Scythe Kama Stay + 2x Scythe Slip Stream,
    Enermax Liberty 400W @ max. 520W + BeQuiet Silent Wings USC,
    CM690II+, W7pro
    ultra silent

  13. #12
    claW.
    Gast

    [C] Re: Stringlänge im Puffer zurückgeben

    ich wollte dir nur aufzeigen was passiert, wenn du das \0 weglässt. dass dort noch ein \0 eingefügt werden muss, war doch gar nicht der sinn der sache. dass man mit strncpy/strncat auch auf "normalem" wege arbeiten kann, das hab ich doch gar nicht gemeint.

  14. #13
    Lieutenant
    Ersteller dieses Themas

    Dabei seit
    Jul 2008
    Beiträge
    937

    [C] AW: Stringlänge im Puffer zurückgeben

    Ich versteh's aber trotzdem nicht, muss man da bei strncpy einen Char mehr nehmen wegen dem \0? Und wieso nicht bei strncat?
    GA870A-UD3, 2x2GB RAM, OCZ Vertex2E60,
    X6 1055T + Scythe Mugen B,
    Palit GTX 275 + Scythe Kama Stay + 2x Scythe Slip Stream,
    Enermax Liberty 400W @ max. 520W + BeQuiet Silent Wings USC,
    CM690II+, W7pro
    ultra silent

  15. #14
    Lieutenant
    Dabei seit
    Mär 2006
    Beiträge
    721

    [C] AW: Stringlänge im Puffer zurückgeben

    Damit C-String-Funktionen korrekt funktionieren, muss der Basispuffer mindestens ein \0 aufweisen.

    "abc" entspricht im Speicher abc\0
    "def" enspricht demnach def\0

    wenn man jetzt nur 3 Bytes kopiert, wird das \0-Zeichen entsprechend weggelassen.

    Bei strncpy macht das noch nicht viel Unterschied, außer, dass der String für weitere Stringfunktionen aufgrund des fehlenden Nullterminators unbrauchbar wird. strncpy fängt direkt an Offset 0 des übergebenen Puffers mit Schreiben an, also an der Basis-Adresse von str.
    strncat SUCHT nach dem Nullzeichen und hängt dort die Buchstaben 'd' 'e' und 'f' an - allerdings wieder ohne Nullzeichen.

    strcpy(x,y) auf der anderen Seite hingegen kopiert alle Zeichen aus y nach x, inklusive dem Nullterminator und bricht beim Auffinden des Nullzeichens ab.

  16. #15
    Lt. Commander
    Dabei seit
    Feb 2002
    Beiträge
    1.799

    [C] AW: Stringlänge im Puffer zurückgeben

    Zitat Zitat von foggy80 Beitrag anzeigen
    Die Fehlermeldung würde mich auch garnicht stören wenn das Programm laufen würde...
    *eek* Der Compiler versucht dir hier klar zu machen, dass der Code falsch ist. Sollte spontan auch garnicht kompilieren dürfen. Warnings solltest du immer (!) als Fehler betrachten und ernst nehmen. Du kannst hier auch gerne immer Fragen, wenn du eine Warning nicht verstehst. Dafür sind wir hier ja da. :-)
    Da du anscheinend den GCC benutzt, solltest du möglichst immer mit den switches -ansi -pedantic-errors übersetzen. Wenn das Programm dann kompiliert, ist es zumindest sprachlich korrekt.

  17. #16
    Lieutenant
    Ersteller dieses Themas

    Dabei seit
    Jul 2008
    Beiträge
    937

    [C] AW: Stringlänge im Puffer zurückgeben

    aus der strlen.h:
    size_t strlen(const char *str);
    damit kann man ganz einfach die Stringlänge ermitteln.
    GA870A-UD3, 2x2GB RAM, OCZ Vertex2E60,
    X6 1055T + Scythe Mugen B,
    Palit GTX 275 + Scythe Kama Stay + 2x Scythe Slip Stream,
    Enermax Liberty 400W @ max. 520W + BeQuiet Silent Wings USC,
    CM690II+, W7pro
    ultra silent

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •