strlen zählt '\0' nicht mit? Etwas Unsicher



  • Ich fand diesen Code hier im Netz:

    #include <stdio.h>
    #include <stdlib.h>
    
    #define BUF 255
    
    int main(void) {
        int counter = 0;
        FILE *fp;
        char file[BUF],temp[BUF];
        char line[BUF];
        printf("Input full Path: ");
        fgets(file, BUF, stdin);
        file[strlen(file) - 1] = '\0';   
    
        fp = fopen(file, "r");
        if(fp == NULL) 
            return EXIT_FAILURE;
    
        for(;;)   {
        if (fgets(temp,BUF,fp) != NULL)
              counter++;
        else  {
             printf("Lines counted: %d", counter);
             break;
           }       
        }          
        getchar();
        return EXIT_SUCCESS;
    }
    

    Ich bin noch Anfänger und las grade letztens noch in meinem Buch das strlen das '\0' nicht mit zählt.
    Kurzes Beispiel:

    t e s t . t x t \n \0
    0 1 2 3 4 5 6 7  8  9
    

    Und zwar diese Zeile macht mich stutzig:

    file[strlen(file) - 1] = '\0';
    

    Somit müsste doch das 't' mit '\0' überschrieben werden.
    Da ja 8 - 1 logischerweise 7 ist.
    Habe ich irgendetwas verkehrt verstanden?



  • strlen zählt aber folgendermaßen

    t e s t . t x t \n \0
    1 2 3 4 5 6 7 8 9
    


  • NDEBUG schrieb:

    strlen zählt aber folgendermaßen

    t e s t . t x t \n \0
    1 2 3 4 5 6 7 8 9
    

    Ah danke.
    Dann ist dann auch bei file[8] das Newline Zeichen.



  • Ist ja auch die Länge in Bytes, die da raus kommt, und kein Index.



  • 7.21.6.3 The strlen function

    Synopsis
    1 #include <string.h>
    size_t strlen(const char *s);
    Description
    2 The strlen function computes the length of the string pointed to by s.
    Returns
    3 The strlen function returns the number of characters that precede the terminating null
    character

    🙂



  • Geschickter wäre ohnehin sowas:

    char *tmp = strchr (file, '\n');
    if (tmp) {
        *tmp = '\0';
    }
    

    da fgets nicht garantiert ein '\n' anhängt.



  • ich dachte das geht nicht weil strlen s_time oder so zurückgibt



  • Stringanfang schrieb:

    ich dachte das geht nicht weil strlen s_time oder so zurückgibt

    strlen liefert ein size_t.


Anmelden zum Antworten