Gorß- und Kleinbuchstaben sowie Sonderzeichen zählen



  • Eine viel elegantere, funktionierende Lösung präsentiert zu bekommen vermindert die Motivation den eigenen Code zu fixen massiv. Vor allem wenn sie so einfach ist dass man sie versteht.
    Auch wenn man daran interessiert ist zu lernen.



  • Also,

    Ich habe versucht meine Fehler zu finden und zu entfernen aber natürlich ist der Vorschlag von dachschaden wesentlich einfacher.
    Ich habe also jetzt diesen Vorschlag verwendet und mein Programm geändert:

    int CountAll(HWND hWnd, char file[256]) {
    
    	CsmallL = 0;
    	CbigL = 0;
    	Cnum = 0;
    	Csymbol = 0;
    	Cspace = 0;
    
    	memset(&letters2[0], 0, sizeof(letters2));
    	memset(&allsymb2[0], 0, sizeof(allsymb2));
    	memset(&CsmallL2[0], 0, sizeof(CsmallL2));
    	memset(&CbigL2[0], 0, sizeof(CbigL2));
    	memset(&Cnum2[0], 0, sizeof(Cnum2));
    	memset(&Csymbol2[0], 0, sizeof(Csymbol2));
    	memset(&Cspace2[0], 0, sizeof(Cspace2));
    	memset(&character[0], 0, sizeof(character));
    
    	GetWindowTextA(TBFunction5, &character[0], 256);
    
    	fi.open(file, ios::in);
    
    	if (!fi.is_open()) {
    		MessageBox(hWnd, L"Error", L"Error", MB_ICONERROR | MB_OK);
    		return -1;
    	}
    
    	while(fi.get(c)){
    
    			if (c >= 'a' && c <= 'z') {
    
    				CsmallL++;
    
    			}
    			else if (c >= 'A' && c <= 'Z') {
    
    				CbigL++;
    
    			}
    			else if (c >= '0' && c <= '9') {
    
    				Cnum++;
    
    			}
    			else if (c == 'ß') {
    
    				CsmallL++;
    
    			}
    			else if (c == ' ') {
    
    				Cspace++;
    
    			}
    			else {
    
    				for (i = 0; i = 16;i++){
    
    					if (c == symbol[i]) {
    
    						Csymbol++;
    
    					}
    
    			}
    
    		}
    
    	}
    
    	letters = CsmallL + CbigL;
    	allsymb = Cnum + Csymbol;
    
    	_itoa_s(letters, letters2, 10, 9);
    	_itoa_s(allsymb, allsymb2, 10, 9);
    
    	_itoa_s(CsmallL, CsmallL2, 10, 9);
    	_itoa_s(CbigL, CbigL2, 10, 9);
    	_itoa_s(Cnum, Cnum2, 10, 9);
    	_itoa_s(Csymbol, Csymbol2, 10, 9);
    	_itoa_s(Cspace, Cspace2, 10, 9);
    
    	if ((character[0] == 'J') | (character[0] == 'j')) {
    
    		p = 4;
    
    	}
    	else if ((character[0] == 'N') | (character[0] == 'n')) {
    
    		p = 5;
    
    	}
    	return 0;
    
    }
    

    Doch wenn die Funktion aufgerufen wird bleibt das gesamte Programm hängen, hat aber keinen Fehler. Ich vermute das es irgendwo in einer Schleife hängenbleibt und diese nie verlässt.

    Kann mir jemand sagen wo das Problem ist?

    Zu den merkwürdigen Zeichen:

    Hier ist der Code der die Werte anzeigen soll:

    TextOutA(
    				hdc,
    				10,
    				70,
    				"kleine Buchstaben: ",
    				19);
    
    			TextOutA(
    				hdc,
    				150,
    				70,
    				CsmallL2,
    				sizeof(CsmallL));
    
    			TextOutA(
    				hdc,
    				10,
    				100,
    				"große Buchstaben: ",
    				17);
    
    			TextOutA(
    				hdc,
    				150,
    				100,
    				CbigL2,
    				sizeof(CbigL));
    
    			TextOutA(
    				hdc,
    				10,
    				130,
    				"Zahlen: ",
    				8);
    
    			TextOutA(
    				hdc,
    				150,
    				130,
    				Cnum2,
    				sizeof(Cnum));
    
    			TextOutA(
    				hdc,
    				10,
    				160,
    				"Sonderzeichen: ",
    				15);
    
    			TextOutA(
    				hdc,
    				150,
    				160,
    				Csymbol2,
    				sizeof(Csymbol));
    
    			TextOutA(
    				hdc,
    				10,
    				190,
    				"Leerzeichen: ",
    				13);
    
    			TextOutA(
    				hdc,
    				150,
    				190,
    				Cspace2,
    				sizeof(Cspace));
    

    Ich würde ja auch einen Screenshot von den Zeichen machen, aber da Das Programm hängenbleibt bevor das Fenster neu gezeichnet wird, geht das nicht.



  • for (i = 0; i = 16;i++)
    

    Schau dir mal die Schleifenbedingung an!

    PS: Und der Debugger ist ein guter Freund 😉



  • Zu den komischen Zeichen...

    sizeof(CsmallL)
    Das ist die Grösse des char-Arrays CsmallL .
    Die ist fix, und unabhängig davon wie viele Zeichen du mittels _itoa_s reingeschrieben hast.
    Hinter dem letzten "normalen" Zeichen steht bei nullterminierten Strings noch ... eine Null (und _itoa_s erzeugt nullterminierte Strings). Danach kommt dann irgendwas.

    Da du aber die gesamte Länge des Arrays an TextOutA übergibst, will TextOutA natürlich auch alle Elemente des Arrays ausgeben. Auch das Null-Zeichen und auch das was dahinter noch steht. Daher erhältst du komische Zeichen im Output.

    Tip: Eine Funktion die dir hier helfen kann ist strlen .

    Tip 2: Guck dir mal die Parameterliste von _itoa_s an. Ich gehe nämlich davon aus dass du da was machst was du eigentlich nicht willst.

    Tip 3: Wenn du sizeof schon kennst, wieso schreibst du dann die Länge der Arrays bei den _itoa_s hard-coded rein (also direkt als Zahl)? Damit erzeugst du bloss unnötige zusätzliche Fehlerquellen.



  • Ja. Da hab ich wohl ein = vergessen.....

    Danke jedenfalls für eure bisherige Hilfe! 🙂

    Hab jetzt das zweite = hinzugefügt und an sonsten nichts geändert.
    Ich bekomme aber immer noch falsche Zahlen.

    Ich benutze eine Textdatei die mal von einem Programm erstellt und gespeichert wurde zum Testen.

    Hier ist der gesamte Inhalt der Datei:

    SIW v4.4.0514e Home Edition Compiled on Jun 9 2013 15:09:46
    LOG: 2016-06-02 15:59:32
    5-2108 155932: ThreadPool.cpp-144 ThreadPool::acceptHandler Util::IsShutdown() inside acceptHandler

    Das Programm zählt jetzt:

    kleine Buchstaben: 101
    große Buchstaben: 21
    Zahlen: 50
    Sonderzeichen: 0
    Leerzeichen: 20

    Wer jetzt mal nachzählt wird feststellen, das diese Werte alle falsch sind.

    Woran liegt das?

    Und Ich hab auch noch nen Screenshot, wo die Symbole zu sehen sind, die ich mir nicht erklären kann.

    http://www.mediafire.com/view/gp8xbnhp75b75p7/Zeichen....png

    Wo kommen diese Zeichen her und wie bekomme ich sie da weg?



  • OK. Die komischen Symbole sind jetzt weg, da ich strlen() benutze.

    Die Frage nach den falschen Zahlen bleibt.



  • XP schrieb:

    Die Frage nach den falschen Zahlen bleibt.

    Dann solltest auch den aktuellen Code zeigen.



  • Der aktuelle Code:

    int CountAll(HWND hWnd, char file[256]) {
    
    	CsmallL = 0;
    	CbigL = 0;
    	Cnum = 0;
    	Csymbol = 0;
    	Cspace = 0;
    
    	memset(&letters2[0], 0, sizeof(letters2));
    	memset(&allsymb2[0], 0, sizeof(allsymb2));
    	memset(&CsmallL2[0], 0, sizeof(CsmallL2));
    	memset(&CbigL2[0], 0, sizeof(CbigL2));
    	memset(&Cnum2[0], 0, sizeof(Cnum2));
    	memset(&Csymbol2[0], 0, sizeof(Csymbol2));
    	memset(&Cspace2[0], 0, sizeof(Cspace2));
    	memset(&character[0], 0, sizeof(character));
    
    	GetWindowTextA(TBFunction5, &character[0], 256);
    
    	fi.open(file, ios::in);
    
    	if (!fi.is_open()) {
    		MessageBox(hWnd, L"Error", L"Error", MB_ICONERROR | MB_OK);
    		return -1;
    	}
    
    	while(fi.get(c)){
    
    			if (c >= 'a' && c <= 'z') {
    
    				CsmallL++;
    
    			}
    			else if (c >= 'A' && c <= 'Z') {
    
    				CbigL++;
    
    			}
    			else if (c >= '0' && c <= '9') {
    
    				Cnum++;
    
    			}
    			else if (c == 'ß') {
    
    				CsmallL++;
    
    			}
    			else if (c == ' ') {
    
    				Cspace++;
    
    			}
    			else {
    
    				for (i = 0; i == 16;i++){
    
    					if (c == symbol[i]) {
    
    						Csymbol++;
    
    					}
    
    			}
    
    		}
    
    	}
    
    	letters = CsmallL + CbigL;
    	allsymb = Cnum + Csymbol;
    
    	_itoa_s(letters, letters2, sizeof(letters2));
    	_itoa_s(allsymb, allsymb2, sizeof(allsymb2));
    
    	_itoa_s(CsmallL, CsmallL2, sizeof(CsmallL2));
    	_itoa_s(CbigL, CbigL2, sizeof(CbigL2));
    	_itoa_s(Cnum, Cnum2, sizeof(Cnum2));
    	_itoa_s(Csymbol, Csymbol2, sizeof(Csymbol2));
    	_itoa_s(Cspace, Cspace2, sizeof(Cspace2));
    
    	if ((character[0] == 'J') | (character[0] == 'j')) {
    
    		p = 4;
    
    	}
    	else if ((character[0] == 'N') | (character[0] == 'n')) {
    
    		p = 5;
    
    	}
    	return 0;
    
    }
    


  • XP schrieb:

    Hab jetzt das zweite = hinzugefügt und an sonsten nichts geändert.
    Ich bekomme aber immer noch falsche Zahlen.

    Naja "==" ist an der Stelle ja auch nicht richtig.
    Betrifft aber natürlich nur die Sonderzeichen.
    Lies dir nochmal durch wie for-Schleifen funktionieren.

    XP schrieb:

    Wer jetzt mal nachzählt wird feststellen, das diese Werte alle falsch sind.

    Also ich für mich hab jetzt keine Lust nachzuzählen.
    Kannst du nicht einen kürzeren Text verwenden?



  • Ok. Hat sich erledigt.

    Ich habe die for-Schleife jetzt geändert:

    for (i = 0; i <= 16;i++){
    
        if (c == symbol[i]) {
    
    	Csymbol++;
    
        }
    }
    

    Und jetzt sind alle Zahlen korrekt.
    Ich habe allerdings keine Ahnung warum sie falsch waren.
    Außer natürlich den Symbolen.

    Danke jedenfalls. 🙂
    Ihr habt mir sehr geholfen.


Anmelden zum Antworten