Ausgabe von Char-Arrays - obwohl z.b. länge 2 ist, gibt er 4 Zeichen aus ?!



  • Hallo,

    ich habe die Aufgabenstellung aus einer Zeichenkette, realisiert über einen Zeiger, das Datum auszulesen. Soweit klappt es, aber wenn ich die ausgelesenen Daten in ein int z.b. umwandeln will, stimmen die Zahlen nicht überein. Bei der Ausgabe der einzelnen Felder ist es kein Problem 😕
    Könnt Ihr vielleicht mir helfen?

    void test(const char *s, int *day, int *month, int *year)
    {
    
       int i = 0;
       int z = 0;
       int c = 0;
       char tag[2];
       char monat[2];
       char jahr[4];
    
       while(*(s+i) != '\0'){
    
          if(c == 0 && *(s+i) != '.'){
            tag[z] = *(s+i);
            printf("%c \n", tag[z]); //diese Stimmen
            z++;
            i++;
    
          }else if(c == 0 && *(s+i) == '.'){
          printf("%s \n", tag); //diese wiederrum nicht
          z = 0;
          c = 1;
          i++;
          printf("hier muss ich einmal sein \n");
          }
    
          if(c == 1 && *(s+i) != '.'){
    
            monat[z] = *(s+i);
            printf("%c \n", monat[z]);
            z++;
            i++;
          }else if(c == 1 && *(s+i) == '.'){
              printf("%s \n", monat);
              printf("hier muss ich wieder sien\n");
          z = 0;
          c = 2;
          i++;
          }
    
          if(c == 2 && *(s+i) != '\0'){
            jahr[z] = *(s+i);
            printf("%c \n", jahr[z]);
            i++;
            z++;
          }
       }
    
       day = atoi(tag);
       printf("Tag: %d \n", day); // diese stimmen auch nicht
    
       month = atoi(monat);
       printf("Tag: %d \n", month);
    
        year = atoi(jahr);
       printf("Tag: %d \n", year);
    }
    


  • ...



  • Wenn ihr atoi benutzen dürft, dann vllt. auch sscanf?

    int main ( void )
    {
    	char* date = "18.04.2013", *s;
    	int day, month, year;
    	// format des datums nach dem einlesen, vor dem konvertieren auf gültigkeit prüfen...
    	// da date ein zeiger auf char ist, lesen wir hier das datum 'über einen zeiger ein' :D
    	sscanf ( date, "%d.%d.%d", &day, &month, &year );
    	printf ( "day: %d month: %d year: %d\n", day, month, year );
    
    	day = month = year = 0;
    	// jetzt ohne mit sscanf zu 'schummeln'
    	for ( s = date; *s != '.'; s++ )
    		day *= 10, day += *s - '0';
    	for ( s++; *s != '.'; s++ )
    		month *= 10, month += *s - '0';
    	for ( s++; *s; s++ )
    		year *= 10, year += *s - '0';
    
    	printf ( "day: %d month: %d year: %d\n", day, month, year );
    	return 0;
    }
    


  • Achte darauf, dass Du Warnungen Deines Compilers einschaltest und beachtest.

    Z.B. bei

    day = atoi(tag);
       printf("Tag: %d \n", day); // diese stimmen auch nicht
    
       month = atoi(monat);
       printf("Tag: %d \n", month);
    
        year = atoi(jahr);
       printf("Tag: %d \n", year);
    

    Wird vom Compiler gewarnt:

    test.c:1:8: warning: assignment makes pointer from integer without a cast [enabled by default]
    test.c:2:4: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘int *’ [-Wformat]
    test.c:4:10: warning: assignment makes pointer from integer without a cast [enabled by default]
    test.c:5:4: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘int *’ [-Wformat]
    test.c:7:10: warning: assignment makes pointer from integer without a cast [enabled by default]
    test.c:8:4: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘int *’ [-Wformat]
    


  • zuweisungen und ausgaben über einen zeiger erfolgen mit dem dereferenzierungsoperator.

    int day = 0;
    	int* pday = &day;
    
    	*pday = 18;
    	printf("%d", *pday);
    

Log in to reply