Aufgabe Kontrollieren
-
Hallo, könnte bitte mal jemand drüber schauen und evtl. Verbesserungsvorschläge machen? Danke schonmal
Schreiben Sie die Funktion index() in C, die ein bestimmtes Zeichen in einem String sucht und die Anzahl der vorkommenden Zeichen zurück gibt.
#include <stdio.h> #include <string.h> #include <stdlib.h> int index(char* str); int main() { char str[50], key; int count=0; ... gets(str); ... scanf("%c",&c); ... if((count=index(str, key))>0) printf("%c wurde %d mal in \"%s\" gefunden", c, count, str); else puts("Das gesuchte Zeichen konnte nicht gefunden werden!"); ... return 0; } int index(char* str, c) { int n=1; char *pch; printf("Suche %c in \"%s\"", c, str); if((pch = strchr(str, atoi(c)))==NULL) return 0; while(pch!=NULL) pch = strchr(pch+1, atoi(c)), n++; return (n); }
-
char c[2]; ... fgets( str, 50, stdin ); ... fgets( c, 2, stdin ); ... if((count=index(str, *c))>0) printf("%c wurde %d mal in \"%s\" gefunden", *c, count, str);
int index(char* str, char c) { int n=0; printf("Suche %c in \"%s\"", c, str); while( *str ) if( *str++ == c ) ++n; return n; }
-
Vielen Dank, das is ja wirklich viel einfacher.
Nur so nebenbei, bist du beruflich Programmierer?
schönen Abend noch
-
Ja.
-
Wutz schrieb:
Ja.
na super!
-
unsigned n = 0; char *in = xxx; char c = XXX; while((in = strchr(in,c))) n++; printf("%d",n);
-
RageR schrieb:
unsigned n = 0; char *in = xxx; char c = XXX; while((in = strchr(in,c))) in++, n++; printf("%d",n);
-
while((in = strchr(in++,c))) n++;
-
Danke für die Antworten.
Hab gleich den nächsten Schub:
#include <stdio.h> int summe(int array[][5], int *rowsm, int *colsm); int main (void) { int matrix[3][5]={{25,34,26,12,8},{19,27,27,11,4},{6,15,35,36,18}}; int zsum[3], spsum[5], gesamt; double mittelwert; gesamt = summe(matrix, zsum, spsum); mittelwert = gesamt/(3*5); printf("Mittelwert:%10f", mittelwert); return 0; } int summe(int array[][5], int *rowsm, int *colsm) { int i,j; for (i=0; i<3; i++) { for (j=0; j<5; j++) { rowsm[i] += array[i][j]; printf("%dte Zeilensumme: %d \n", i+1, rowsm[i]); } for (j=0; j<5; j++) { for (i=0; i<3; i++) { colsm[j] += array[i][j]; printf("%dte Spaltensumme: %d \n", j+1, colsm[j]); } return(rowsm[0]+rowsm[1]+rowsm[2]); }
Die Ausgabe funktioniert iwie nicht :/, vielleicht sieht es jemand?
MfG
-
Du hast zwei schließende (Geschweifte-) Klammern vergessen:
for (i=0; i<3; i++) { for (j=0; j<5; j++) { rowsm[i] += array[i][j]; printf("%dte Zeilensumme: %d \n", i+1, rowsm[i]); } } for (j=0; j<5; j++) { for (i=0; i<3; i++) { colsm[j] += array[i][j]; printf("%dte Spaltensumme: %d \n", j+1, colsm[j]); } }
Und ausserdem solltest du 'zsum' und 'spsum' mit sinnvollen Werten füllen bevor du 'summe' auf sie loslässt:
memset(zsum, 0, sizeof(zsum)); memset(spsum, 0, sizeof(spsum));
-
Ok, danke. Kommt es denn häufig vor, dass Speicher nicht 0-initialisiert ist und es deswegen zu Fehlern kommt? Oder ist die 0-Initialisierung (mit calloc oder memset) mehr ein Formalismus ?
Habe nun
if (((pmem=calloc(sizeof(rowsm), sizeof(int))==NULL) ||(pmem=calloc(sizeof(colsm), sizeof(int))==NULL) {printf("Failed to allocate memory"), return 1;
eingefügt. Genügt hierbei ein Pointer (pmem) zur Überprüfung?
-
Der Speicher wird implizit "initialisiert" (falls du das nicht explizit tust). Allerdings mit Werten die i.A. nicht besonders viel Sinn ergeben. Speziell für dein Aufsummieren macht das kein Sinn, daher musst du den Speicher mit 0 füllen.
Warum du für die Aufgabe nochmal extra Speicher anforderst ist mir nicht ganz klar...
-
ah ok, dachte memset reserviert genauso wie calloc speicher.
-
jizzerr schrieb:
ah ok, dachte memset reserviert genauso wie calloc speicher.
In so Fällen kannst du sicher gehen und in einer Doku nachschlagen.
-
Ok, nächste Frage:
Kann mir jemand erklären was die Makros SEEK_SET, SEEK_CUR und SEEK_END bewirken. Ich verstehe z.b. nicht, warum ich bei SEEK_END eine Referenz und einen Offset brauche, wenn ich doch vielleicht garnicht weiß, wie weit das Ende der Datei vom Anfang entfernt ist??
-
Hat sich erledigt, sorry
-
Ist ein typedef bei linearen Listen erlaubt?
typedef struct { char Marke[15], Farbe[15],..,Typ[15]; Auto_s *next; } Auto_s;
Da für next der Datentyp Auto_s verwendet wird, bevor er umbenannt wurde ?