abzählen von Zeichen
-
hallo!
ich will die zeichen meiner selbsteingegeben buchstaben abzählen
klappt auch wenn ich nur ein paar schreib
aber wenn ich mehr schreib zb. 80 zeichen mach, dann funktioniert es nichtdas readline() dings haben wir in einer vorlesung gemacht und ich hab es von der folie kopiert und umgeformt..
ich weiß nicht, was der fehler ist..bitte um hilfe.#include <stdio.h> #include <stdlib.h> #include <string.h> char* readLine() { int ch, len; char *buffer = malloc(1); for (len=0; (ch = getchar()) != '\n' && ch != EOF;len++) { buffer[len] = ch; buffer = realloc(buffer, len+1); } buffer[len] = '\0'; return buffer; } int main() { int block; char *line_1 = readLine(); int zeichen = strlen(line_1); if (zeichen%160) { block = (zeichen/160)+1; } else { block = (zeichen/160); } printf("\n"); printf("#########################\n"); printf("Text= %s\n", line_1); printf("#########################\n"); printf("# Zeichen: %i\n", zeichen); printf("# %i Teile\n",block); printf("#########################\n"); free(line_1); getch(); return 0; }
-
kaizen schrieb:
hallo!
... dann funktioniert es nicht ...Wie äußert sich das?
P.S.
Die Speicherallozierung in Zeile 12 ist riskant, weil realloc NULL zurückgeben könnte. In dem Fall würde es in Zeile 11 oder 14 einen Absturz zur Folge haben.MfG
F.d.S.
-
wie äußerts sich das..
also es kommt dann ein feld auf(ich arbeite mit devc++) und da steht dann
..exe funktioniert nicht mehrdas programm wird aufrund eines Problems nicht richtig ausgeführt. Das Program wird geschlossen und sie werder benachrichtigt, wenn eine Lösung verfügbar ist.
das mit zeile 13 usw..das hab ich wie gesagt von den vorlesungsfolien kopiert und weiß eigentlich selbst nicht so ganz was sie ausdrücken..
wenn ich im programm einfach schreibe:
abc und dann enter drückekommt ganz normal
Text=abc
zeichen:3
teile 1 (deshalb 160, weil es später ein sms schneideprogramm sein soll)aber gebe ich ein zb:
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadann kommt diese meldung
-
Das wundersame ist, wenn ich das im Debug-Modus kompiliere, dann stürzt das Programm auch bei der Eingabe eines Zeichens ab.
Kompiliere ich es im Release-Modus, funktioniert es einwandfrei, auch bei einer Anzahl von mehr als 80 Zeichen.
Bin im Moment ratlos, sorry.
-
Es ist reiner Zufall, bei welcher Zeichenanzahl das Programm abstürzt. Der Speicher wird zu klein reallokiert und könnte bereits beim zweiten Schleifendurchlauf abstürzen. Hier eine korrigierte Version. Vier Änderungen:
- Das umständliche Teilen mit Aufrunden habe ich in eine Funktion ausgelagert und dabei eine übliche Implementierung benutzt.
- Die Funktion getch() mag bei dem einen oder anderen Compiler so funktionieren, sollte sie aber nicht, weil sie nicht in den include - Dateien definiert ist. Ich habe getchar() aus stdio.h genommen.
- Richtige Array-Größe in der Schleife.
- Überprüfung auf null-pointer. Könnte vielleicht interessant werden, wenn man das Programm z.B. durch Umleitung der Standardeingabe mit richtig viel Daten füttert.#include <stdio.h> #include <stdlib.h> #include <string.h> char* readLine() { int ch, len; char *buffer = malloc(1); for (len=0; (ch = getchar()) != '\n' && ch != EOF;len++) { buffer[len] = ch; // Wenn nur len+1 ist der Speicher zu klein: buffer = realloc(buffer, len+2); if(!buffer) return NULL; } buffer[len] = '\0'; return buffer; } //Simple Funktion für aufrundende Ganzzahldivision int ceil_div(int a, int b) { if (!a) return 0; return ((a - 1) / b) + 1; } int main() { int block; char *line_1 = readLine(); if(!line_1){ puts("Fehler bei der Speicherallokation!"); return -1; } int zeichen = strlen(line_1); //Siehe Funktionsdefinition: block = ceil_div(zeichen,160); printf("\n"); printf("#########################\n"); printf("Text= %s\n", line_1); printf("#########################\n"); printf("# Zeichen: %i\n", zeichen); printf("# %i Teile\n",block); printf("#########################\n"); free(line_1); //statt getch(), welches nur in conio.h definiert ist: getchar(); return 0; }Mein Tipp: Wenn Du in plain C programmierst bzw. manuelle Speicherallokation in C++ benutzt: Lass Dir ganz viel Zeit, denke gründlich nach und kümmer Dich nach einem malloc() erstmal darum, wo das free() hingehört bevor Du weitermachst.
-
danke, dass mit dem speicher hab ich mittlerweile selbst bemerkt...also len+2
aber das schlechte is, ich hab grad erfahren, dass ich <string.h> nicht verwenden darf.
also muss ich das ganze sowieso wieder von neu überdenken
-
Nein, Du benutzt string.h doch fast gar nicht. Es ist nur ein Ersatz für strlen() nötig. Bitteschön:
int _strlen(const char* s) { int x = 0; while(s != 0 && *s++ != '\0') ++x; return x; }