C Anzahl der Zeichen in einem Array zählen

davidsp456

Newbie
Registriert
Jan. 2022
Beiträge
2
Hallo zusammen,

für die Uni müssen wir in Programmieren die Anzahl der Zeichen in einem Array zählen. Wir sind seit über 3 Stunden an dieser Aufgabe und kommen einfach nicht weiter.
Die Lösung haben wir eigentlich, aber es taucht in der Funktion immer eine Fehlermeldung auf, wenn wir versuchen mit sizeof() die Anzahl der Zeichen auszulesen.


C:
#define MAXL 256

//Bibliotheken einbinden
#include <stdio.h>

int myStrlen(char s[]) {
    for (int i = 0; i < MAXL && (s = getchar()) != '\n'; ++i) {
        int length = sizeof(s) / sizeof(char);
        return length;
        
    }
    
}

int main()
{
    char s[MAXL];

    // Einlesen der Zeichenkette sowie speicherung in die Variable s
    printf("Bitte gebe eine Zeichenkette ein: \n");
    myStrlen(s);


    printf("Die Zeichenkette ist wie folgt lang: \n");
    printf("%d", myStrlen(s));
}

In Zeile 9 kriegen wir folgende Fehlermeldung:

sizeof eines Zeigers wird durch einen anderen Wert dividiert.

In Internetbeiträgen ist der Code genau gleich, eben nur nicht in einer Funktion etabliert, nur bei uns klappt es nicht.

Liebe Grüße

David
 
Probier mal das:

C:
unsigned int mystrlen(char* str) {
    unsigned int i = 0;
    for (;i < MAXL; i++) {
        if (str[i] == '\0') return i;
    }
    return i;
}
 
  • Gefällt mir
Reaktionen: davidsp456
Schön die Lösung hinzuklatschen ohne zu erklären, warum das andere nicht funktioniert.

Das Problem an sizeof ist, dass es für Arrays, die als Parameter übergeben wurden, nicht unbedingt funktioniert - aber das ist nicht mal das eigentliche Problem, sondern dass das Array selbst ja eine feste Größe hat unabhängig davon, wie viele Zeichen ihr eingegeben habt. Insofern bleibt eigentlich nur das manuelle zählen.

Generell ergab es auch wenig Sinn, innerhalb der Schleife wiederum die Länge so zu berechnen, weil ihr die Schleife und die Funktion ja sofort verlasst beim ersten Durchlauf durch die Schleife (Zeile 9) und das Ergebnis selbst ist vollkommen unabhängig davon, wie oft die Schleife durchlaufen wäre (also sofern sie mindestens einmal durchlaufen wurde)..

Die Idee ist ja, das Array selbst durchzusuchen mit Hilfe der Laufvariable i. Aber die nutzt ihr dann am Ende gar nicht für die Information, wie viele gültige Zeichen das Array/der String enthält, die Formel aus Zeile 8 würde eher berechnen, wie viele Zeichen das Array gesamt fassen kann (inkl. 0-Byte als Terminierungsmarkierung).

Und noch eine Frage: Was soll Zeile 21 bewirken? Die Eingabe des Strings? Die solltet ihr anders realiseren als in der Schleife.
Die Funktion selbst soll ja nur die Länge berechnen, sich aber nicht um die Eingabe kümmern.


Und grundsätzlich würde ich euch empfehlen, eher den Kontakt mit Tutoren zu suchen wenn ihr Probleme mit den Aufgaben habt als euch die Lösung im Internet zu suchen.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: andy_m4
Das ist Uni Niveau? Hm...

Also hier ist einiges verquirlt. In euerm Programm müsst ihr den gleichen Text ja 2x eingeben, da ihr den Text ja in myStrlen einlest. Also mein Tipp: Eine Funktion zum Einlesen, und eine zum Zeichen zählen.
Und hier müsst ihr wissen, wie Zeichenketten definiert bzw. terminiert werden. Und der Compiler kann mit sizeof() nur die Größe von festen Typen zurückgeben. Ein Array ist in C meist immer nur die Anfangsadresse, wie viel Inhalt dahinter steht, weiß der Compiler nicht, denn um diese Implementierung kümmert sich der Entwickler bzw. die Bibliothek.
 
  • Gefällt mir
Reaktionen: maloz und blöderidiot
kannst du mir Zeile 7 s=getchar() erklären
 
@DeZpoon: Vermutlich 7. Semester mit fortgeschrittenen KI-Algorithmen... Oder vielleicht erstes Semester nach rund 10 Wochen Vorlesungszeit? Bin mir nicht so ganz sicher...

Und wer denkt, im Studium würde man lernen zu programmieren, der irrt sich eh. Also man lernt vielleicht Dinge wie Syntax usw, mehr aber auch nicht. In der Fahrschule lernt man auch nur die Grundlagen des Autofahrens und ist kein fertiger Fahrer, wenn man sie verlässt.
 
  • Gefällt mir
Reaktionen: Napst3r
Ja selbst in der kleinen Übung stecken dann schon einige Fießlichkeiten drin. Fertig lernt man C in Kursen nicht, dazu muss man selber einfach ein bisschen rumspielen.

Denn wenn du dir bspw. zum Einlesen einen Puffer anlegst und auf diesen ein sizeof anwendest, wirst du feststellen: Es gibt die erwartete Größe zurück. Übergeben an eine Funktion wiederum nicht:
C:
#include <stdio.h>
#define MAX_LEN 256
char BUFFER[MAX_LEN];

void SomeFunction(char str[])
{
        printf("sizeof(BUFFER): %d\n", (int)sizeof(BUFFER));
        printf("sizeof(str): %d\n", (int)sizeof(str));
}

int main(int argc, char** argv)
{
        SomeFunction(BUFFER);
}

Sollte folgende Ausgabe produzieren:

Code:
sizeof(BUFFER): 256
sizeof(str): 8

So, hinsetzen und verstehen ;-) Vor allem warum der sizeof(str) = 8 ist (es könnte bei dir auch 4 ergeben).
 
Zuletzt bearbeitet:
Wichtiger wäre es zu verstehen, warum es bei dem Problem gar nicht um sizeof geht.
 
tollertyp schrieb:
Wichtiger wäre es zu verstehen, warum es bei dem Problem gar nicht um sizeof geht.
Achwas, ist doch egal - man bekommt hier die Lösung und warum was lernen wollen?
 
  • Gefällt mir
Reaktionen: tollertyp
Natürlich wird er gehenkt. Laut OP fehlt grundlegendes Verständnis - nicht mal spezifisch für das Problem an sich, sondern für die Problemzerlegung - der Fachmann würde sagen, "für die Heuristik", also den Entwurf des Ablaufs.

Offensichtlichstes Beispiel: Wenn ich eine Schleife habe über k von 0 bis n, und ich habe kein k in der Schleife, warum verwende ich dann eine Schleife?

Interaktion mit der Konsole inner- oder außerhalb der Schleife sind da nachrangig, das würde ich auch von keinem Erstsemester ohne Ahnung von Side-Effects erwarten (gehe allerdings davon aus, daß man bei Testläufen dann "huch?" sagt, vor allem bei *Ein*gaben).

Nope, ich schlage dem TO dringend vor, daß er nochmal einen Schritt zurückgeht, "die Programmierung" im Sinne einer Implementierung von Problemlösungen nochmal zurückstellt und beim Wesentlichen anfängt: dem Entwurf, dem Verlauf des Programms, sinngemäß: dem "Gedankenexperiment" des Programms. Was soll passieren? Was will ich wissen? Wenn ich x habe, wie komme ich zu ƒ(x)?

Dann passiert sowas wie im OP nicht.


Und das soll's in Richtung Hausaufgabenhilfe von meiner Seite auch gewesen sein. Ist das eigentlich inzwischen hier erlaubt? 🤔
 
  • Gefällt mir
Reaktionen: tollertyp, aw48, schasi und eine weitere Person
so so, Programmieren für die Uni.
Bei Lernproblemen zu helfen läßt sich eigentlich nur mit Selbstdarstellung des Helfers erklären.
An der Uni erst mal "Lernen" lernen, dann Programmieren.
 
Zurück
Oben