• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Viele hassen ihn, manche schwören auf ihn, wir aber möchten unbedingt sehen, welche Bilder Ihr vor Eurem geistigen Auge bzw. vor der Linse Eures iPhone oder iPad sehen könnt, wenn Ihr dieses Wort hört oder lest. Macht mit und beteiligt Euch an unserem Frühjahrsputz ---> Klick

C Programm (Buchstaben zählen)

fufL

Goldparmäne
Registriert
14.05.08
Beiträge
561
Hallo zsamm!

Hab ein Problem. Und zwar sollen wir in der Uni ein Programm schreiben, bei dem man eine Zeichenkette eingibt und dann einen Buchstaben oder eine Zahl die in der Kette gesucht und gezählt wird. Danach soll das Ergebnis ausgegeben werden.

Soweit so gut. Ich hab das ganze jetzt mal ohne eine Funktion geschrieben und da kommt folgendes raus:
Code:
#define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h>
int count_char(char *str, char zeichen);
int main(void)
{
    
    int i = 0, z = 0;
    char kette[100];
    char zeichen[2];
    printf("Bitte Zeichenkette (max. 99) eingeben: ");
    scanf("%99s", kette);
    printf("Zu suchendes Zeichen: ");
    scanf("%1s", zeichen);


    for(i = 0; i < 100; ++i)
        if(kette[i]==zeichen[0])
            z++;
    printf("Gesuchtes Zeichen -%s- kam %d mal vor.\n", zeichen, z);
    return 0;
}
Und das funktioniert auch und tut es einwandfrei!

Jetzt will der Prof aber eine Funktion haben der die Zeichenkette und das zu suchende Zeichen übergeben wird und dann die ermittelte Anzahl zurückgibt ins main Programm. Er hat die Funktion int count_char(char *str, char zeichen); gennant. Was hat es denn mit dem * auf sich? Ist das nötig?

Denn mein Programm schaut jetzt so aus:
Code:
#define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h>
int count_char(char kette, char zeichen);
int main(void)
{

    char kette[100];
    char zeichen[2];
    printf("Bitte Zeichenkette (max. 99) eingeben: ");
    scanf("%99s", kette);
    printf("Zu suchendes Zeichen: ");
    scanf("%1s", zeichen);
    printf("Gesuchtes Zeichen -%s- kam %d mal vor.\n", zeichen, count_char(kette[100], zeichen[2]));
    return 0;
}

int count_char(char kette, char zeichen)
{
    int i, z = 0;
    for(i = 0; i < 100; ++i)
        [COLOR=Red][B]if(kette[i]==zeichen[0])[/B][/COLOR]
            z++;    
    return z;
}
Aber er gibt mir jetzt einen Fehler in der Markierten Zeile aus der wie folgt lautet:
error C2109: Index erfordert ein Array oder einen Zeigertyp

Wie bring ich das denn nu zum laufen? :D
Hab im Moment irgendwie keine Ahnung mehr...
 

gKar

Maunzenapfel
Registriert
25.06.08
Beiträge
5.362
Das * steht für einen Zeiger. (Wobei ich die C-Syntax hier äußerst unlogisch und für Anfänger verwirrend finde.)
Und natürlich gibt es einen enormen Unterschied zwischen einem Zeiger auf eine Folge von Zeichen und einem einzelnen Zeichen, wie Du es mit dem formalen Parameter "char kette" übergibst: Das ist eben keine Zeichenkette.

Aber der Frage nach zu urteilen, solltest Du vielleicht erstmal das Zeigerkonzept wiederholen.

(Fragen wie diese bestärken mich in der Meinung, dass es keine so gute Idee ist, Programmieranfängern ANSI-C zuzumuten. Pascal, wie wir es im Einsteigerkurs verwenden, ist da einfach viel übersichtlicher und leichter zu lernen. Und wenn man erstmal alle Konzepte verstanden hat, fällt der Umstieg auf eine andere Sprache auch nicht schwer.)
 

cByte

Alkmene
Registriert
23.02.09
Beiträge
32
Wenn du in der Main dein char_count aufrufst, nimm da mal das [100] und [2] bei der Arrayübergabe weg, also char_count(kette, zeichen). am besten machst du vor beide noch ein &. dann übergibst du nur ne referenz. sonst werden die arrays kopiert, was hier zwar nicht schlimm, aber unschön ist.

Gruß
 

Gogul

Uelzener Rambour
Registriert
21.05.04
Beiträge
372
in der Funktion count_char wird nur ein "char zeichen" übergeben, in deiner main rufst du es aber mit einem char array (char zeichen[2]) auf!

Code:
#define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h>
int count_char(char kette, char zeichen);
int main(void)
{

    char kette[100];
    char zeichen;
    printf("Bitte Zeichenkette (max. 99) eingeben: ");
    scanf("%99s", kette);
    printf("Zu suchendes Zeichen: ");
    scanf("%c", &zeichen);
    printf("Gesuchtes Zeichen -%c- kam %d mal vor.\n", zeichen, count_char(kette[100], zeichen));
    return 0;
}

int count_char(char kette, char zeichen)
{
    int i, z = 0;
    for(i = 0; i < 100; ++i)
        if(kette[i]==zeichen)
            z++;    
    return z;
}

ohne es jetzt ausprobiert zu ham!
 

fufL

Goldparmäne
Registriert
14.05.08
Beiträge
561
Das * steht für einen Zeiger. (Wobei ich die C-Syntax hier äußerst unlogisch und für Anfänger verwirrend finde.)
Und natürlich gibt es einen enormen Unterschied zwischen einem Zeiger auf eine Folge von Zeichen und einem einzelnen Zeichen, wie Du es mit dem formalen Parameter "char kette" übergibst: Das ist eben keine Zeichenkette.

Aber der Frage nach zu urteilen, solltest Du vielleicht erstmal das Zeigerkonzept wiederholen.

(Fragen wie diese bestärken mich in der Meinung, dass es keine so gute Idee ist, Programmieranfängern ANSI-C zuzumuten. Pascal, wie wir es im Einsteigerkurs verwenden, ist da einfach viel übersichtlicher und leichter zu lernen. Und wenn man erstmal alle Konzepte verstanden hat, fällt der Umstieg auf eine andere Sprache auch nicht schwer.)
Naja darüber lässt sich halt jetzt diskutieren... Bei uns an der Uni sind sie der Meinung, dass man C braucht bei der Fahrzeugentwicklung etc. und daher haben wir das 1 Semester als Vorlesung mit Praktikum und noch eine Grundlagenvorlesung... Muss man durch...

Wenn du in der Main dein char_count aufrufst, nimm da mal das [100] und [2] bei der Arrayübergabe weg, also char_count(kette, zeichen). am besten machst du vor beide noch ein &. dann übergibst du nur ne referenz. sonst werden die arrays kopiert, was hier zwar nicht schlimm, aber unschön ist.

Gruß
Also das funktioniert überhaupt nicht. Da bekomm ich noch mehr Fehler ;)

in der Funktion count_char wird nur ein "char zeichen" übergeben, in deiner main rufst du es aber mit einem char array (char zeichen[2]) auf!

Code:
#define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h>
int count_char(char kette, char zeichen);
int main(void)
{

    char kette[100];
    char zeichen;
    printf("Bitte Zeichenkette (max. 99) eingeben: ");
    scanf("%99s", kette);
    printf("Zu suchendes Zeichen: ");
    scanf("%c", &zeichen);
    printf("Gesuchtes Zeichen -%c- kam %d mal vor.\n", zeichen, count_char(kette[100], zeichen));
    return 0;
}

int count_char(char kette, char zeichen)
{
    int i, z = 0;
    for(i = 0; i < 100; ++i)
        if(kette[i]==zeichen)
            z++;    
    return z;
}
ohne es jetzt ausprobiert zu ham!
Also da bleibt der selbe Fehler bestehen... steht aber nur noch 1x da und nicht 2mal :D
 

Gogul

Uelzener Rambour
Registriert
21.05.04
Beiträge
372
Beim der Funktion fehlt das *
Beim einlesen mit scanf() und %c muss man auch noch mit dem eingabepuffer aufpassen, das hier geht:

Code:
#define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h>
int count_char(char *kette, char zeichen); //Prototyp mit *
int main(void)
{
	
    char kette[100];
    char zeichen[2];
    printf("Bitte Zeichenkette (max. 99) eingeben: ");
    scanf("%99s", kette);
    printf("Zu suchendes Zeichen: ");
    scanf("%1s", zeichen);
    //jetzt wird count_char mit zweichen[0] aufgerufen, das entspricht einem einzelnen char
    printf("Gesuchtes Zeichen -%c- kam %d mal vor.\n", zeichen[0], count_char(kette, zeichen[0]));
    return 0;
}

int count_char(char *kette, char zeichen)
{
    int i, z = 0;
    for(i = 0; i < 100; ++i)
        if(kette[i]==zeichen)
            z++;    
    return z;
}

zwei sachen die du dir durchlesen solltest:

pointer

arrays

und hier steht noch was zum eingabepuffer
 

hanebambel

Becks Apfel (Emstaler Champagner)
Registriert
31.08.04
Beiträge
333
[...] sonst werden die arrays kopiert, was hier zwar nicht schlimm, aber unschön ist.
[...]

Vorsicht! C kopiert keine Arrays! Wenn Du sowas hier machst:
Code:
char array1[100];
char array2[100];

array1 = array2;

wird nur der Zeiger, der auf array1 zeigt so umgebogen, dass er auf array2 zeigt! Das entspricht dann dem hier:
Code:
&array1[0] = array2;

bzw.

Code:
array1 = &array2[0];

CU Jan ;)
 

cByte

Alkmene
Registriert
23.02.09
Beiträge
32
hmm, hab ich das etwa mit c++ durcheinandergeschmissen?
 

awk

Clairgeau
Registriert
03.07.08
Beiträge
3.687
Wie meinst du das? Beziehst du dich auf das Post über deinem? In C++ kann ein Array auch nicht mit einem anderen initialisiert oder einem anderen zugewiesen werden (ausser man implementiert es selber).
 

cByte

Alkmene
Registriert
23.02.09
Beiträge
32
Hat sich erledigt, hab mich da vertan. Was Gogul geschrieben hat stimmt so. Sorry 4 gestiftete Verwirrung ^^
 

gKar

Maunzenapfel
Registriert
25.06.08
Beiträge
5.362
dass man C braucht bei der Fahrzeugentwicklung etc. und daher haben wir das 1 Semester als Vorlesung mit Praktikum und noch eine Grundlagenvorlesung

Ich bin halt der Meinung (und damit stehe ich nicht allein), dass, auch wenn C in vielen Berufsfeldern benötigt wird, es nicht gerade die beste Sprache für die ersten Schritte ist. Auch jemand, der später Rennfahrer werden will, wird deshlab nicht schon seine ersten Fahrstunden im Rennwagen absolvieren, sondern die Grundlagen in einem dafür besser geeigneten (einfacher zu beherrschenden) Fahrzeug erlernen. Das heißt ja nicht, dass er nicht später doch noch Berufsrennfahrer werden kann. Daher halte ich solche Argumente wie das obige für Humbug. Aber OK, die Entscheidung liegt ja eh nicht bei Dir, Du musst akzeptieren, was Dir vorgesetzt wird ;)
 

hanebambel

Becks Apfel (Emstaler Champagner)
Registriert
31.08.04
Beiträge
333
Es is wie immer im Leben: es kommt drauf an! Wenn man weiß, dass man im späteren leben nur noch OOP macht ist sicher C nicht die beste Sprache zum lernen. Spezialisiert man sich jedoch auf embeddet Systeme bzw. Mikrocontroller is man mit C sehr gut aufgestellt. Weil in der Welt läuft schlussendlich fast alles auf C hinaus bzw. der einstieg in Assembler is mit fundierten C Kenntnissen (böse Zungen behaupten ja, C sei ein generischer Assembler :) auch leichter zu bewältigen...

CU Jan ;)
 

gKar

Maunzenapfel
Registriert
25.06.08
Beiträge
5.362
Wenn man weiß, dass man im späteren leben nur noch OOP macht ist sicher C nicht die beste Sprache zum lernen. Spezialisiert man sich jedoch auf embeddet Systeme bzw. Mikrocontroller is man mit C sehr gut aufgestellt.

Das kann ich alles nicht nachvollziehen. OOP ist ein Paradigma, von vielen Sprachen realisiert, C ist eine Sprache. Das kann man doch nicht vergleichen.
Auch wer OOP lernen will, sollte zunächst Grundkenntnisse in imperativer Programmierung haben. Immerhin ist auf Methodenlevel auch in der OOP alles imperativ. Grundkenntnisse einschließlich Zeigern, Datenstrukturen, Prozeduren etc. kann man also in einer imperativen Sprache lernen und später in der OOP weiter gebrauchen.
Der Punkt war ja nur, dass, wenn man erste Schritte in imperativer Programmierung unternehmen will, C nicht die anfängergerechteste Sprache ist – und das hat nichts damit zu tun, mit ob man später weiterhin imperativ oder objektorientiert programmieren will.

Aber OK, wir driften immer weiter vom ursprünglichen Thema ab und sollten das Thema wohl abschließen.