Mein C++ Qt creator Programm stürzt bei eingaben von umlauten in ein Textfeld ab wie kann ich das verhindern?
Hallo in meinem Programm soll man wenn man einen text eingibt bestimmte dinge analysieren können(Zahl der Buchstaben, Zahl der Vokal ,...) ? allerdings stürzt das Programm ab, sobald man Umlaute eingibt
Mein bisheriger code aus mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->pushButton->hide();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_btnBuchstaben_clicked()
{
DeleteLetter();
CountLetter();
ShowLetter();
}
void MainWindow::DeleteLetter()
{
for (int i=0;i<256;i++)
Buchstaben[i]=0;
}
void MainWindow::ShowLetter()
{
QString work="";
QString einzel;
QString zahl;
ui->AnalyseWidget->clear();
ui->AnalyseWidget->addItem("Auswertung");
for (int i=0;i<256;i++){
einzel =" _____ ";
if (i>=32)
einzel[0]=char(i);
else {
if (i<10){
einzel[0]='0';
einzel[1]='0'+i;
}
else if (i< 20) {
einzel[0]='1';
einzel[1]='0'+i-10;
}
else if (i<30) {
einzel[0]='2';
einzel[1]='0'+i-20;
}
else {
einzel[0]='3';
einzel[1]='0'+i-30;
}
}
zahl = QString::number(Buchstaben[i]);
for (int j = zahl.length()-1;j>=0;j--)
einzel[7-zahl.length()+j]=zahl[j];
work = work + einzel;
if ((i+1)%8==0)
{
ui->AnalyseWidget->addItem(work);
work="";
}
}
}
void MainWindow::CountLetter()
{
QString Area = ui -> EingabeEdit -> toPlainText();
for(int i = 0; i < Area.length();i++)
Buchstaben[Area[i].toLatin1()]++;
}
void MainWindow::on_btnWoerter_clicked()
{
CountWords();
}
void MainWindow::CountWords()
{
QString Area;
Area = ui -> EingabeEdit -> toPlainText();
int i = 0, w = 0;
bool Word = false;
while (i < Area.length())
{
if (Area[i] == ' ' && Word)
{
Word = false;
w++;
}
if (Area[i] == ' ' && !Word)
{
}
if (Area[i] != ' ' && Word)
{
}
if (Area[i] != ' ' && !Word)
{
Word = true;
}
i++;
}
if (Word == true)
{
w++;
}
QString o = QString::number(w);
QString output = "Der Text hat " + o + " Wörter";
ui -> AnalyseWidget -> clear();
ui -> AnalyseWidget -> addItem(output);
}
//Vokale - aus vorhandenem Array rausholen
//Zahlen nachschauen und ausgeben
diese fehlermeldung kommt wenn ich das programm in debug modus starte
so sieht die Gui oberfläche vom programm aus
Lässt sich die Fehlergrenze konkreter eingrenzen (Methode / Zeilennummer)?
Beim ShowLetter scheint irgendwas nicht zu funktionieren, weil das Wörterzählen klappt
- Wie lautet deine Deklaration für Buchstaben? Welchen Wert erhält die Variable?
- Welchen Wert schreibst du in EingabeEdit?
- int Buchstaben[256]; lautet die variable
- in EingabeEdit kommt der text rein den der Benutzer des Programmes analysieren möchte
1 Antwort
Mti was für einen Zeicvhensatz arbeitest Du mit UTF-8 ?? weil das sind unterschiedliche Bytegrößen . dieses toLatin , würde ich nicht nehmen , mach es international richtig , nimm gleich utf-8
und mach dir paar ausgaben in eine logdatei damit du siehst wann es wo abstürtzt
1) Gemeint ist dieser Aufruf:
Buchstaben[Area[i].toLatin1()]++;
Wieso wandelst du dort die Zeichenkodierung um und belässt sie nicht bei UTF-8?
2) Entweder du setzt dir einen Breakpoint und wirfst dann einmal den Debug-Modus an (das wäre der von mir bevorzugte Weg der Fehlersuche) oder du setzt Logs in den Debugstream:
qDebug() << "some message";
Deine Fehlermeldung konnte ich nun mit einem Testprojekt noch nicht reproduzieren. Sofern du den Debugger bei dir nicht zum Laufen bekommst, solltest du deinen Code erst einmal versuchen, mit den oben erwähnten Debug-Nachrichten auszustecken. Die oberste Priorität sollte erst einmal darin liegen, die Fehlerquelle einzugrenzen. Danach wäre der Kontext von Interesse (Werte der umliegenden Variablen, u.ä.).
Mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void on_btnBuchstaben_clicked();
void on_btnWoerter_clicked();
void on_btnZeichen_clicked();
void on_btnVokale_clicked();
void on_btnUmlaute_clicked();
void on_btnLeeren_clicked();
private:
Ui::MainWindow *ui;
int Buchstaben[256];
void DeleteLetter();
void CountLetter();
void ShowLetter();
void CountWords();
};
#endif // MAINWINDOW_H
ich habe es gerade noch mehr mals versucht und es ist so das das Programm um die Buchstaben darzustellen funktioniert solange keine umlaute im text sind. Sobald das der Fall ist hängt sich das Programm auf und es Passiert egal wie lange man wartet nichts mehr. Man kann dann das Programm nurnoch über Qt creator stoppen
Einen Absturz kann ich nach wie vor nicht reproduzieren. Das einzige, was ich sehe, ist, dass du seltsame Sachen in deinem Code machst.
In ShowLetter beispielsweise konvertierst du ein Element deines Arrays in einen String.
zahl = QString::number(Buchstaben[i]);
Das wäre ok, wenn denn die Elemente explizit belegt wären. Das sind sie aber nicht. Wenn du ein Array erstellst, bekommen die Werte initial irgendeinen Wert (nicht unbedingt 0!). Außerdem ist der Variablenname (zahl) missdeutend.
Ich erkenne hinter der gesamten Methode keinen wirklichen Sinn.
Ein anderes Beispiel: CountLetter. Du vertraust darauf, dass das char, welches von toLatin1 zurückgegeben wird, in einen Integer konvertiert werden kann, der in einem validen Wertebereich für dein Array liegt. Wenn ich mir nun einmal die Werte für zwei Sonderzeichen (ä, Ä) ausgeben lasse:
qDebug() << Area[i].toLatin1() << (int)Area[i].toLatin1();
erhalte ich jedesmal einen Wert unter 0. Das heißt, an der Stelle findet ein Überlauf statt. Richtig wäre die Konversion via unicode-Methode.
ushort index = Area[i].unicode();
Wobei auch hier trotzdem noch ein Überlauf stattfinden kann, denn es wird der Unicode-Zeichensatz abgebildet, der den ASCII-Zeichensatz deutlich überbietet. Du solltest erst prüfen, ob der berechnete Index über den erlaubten Bereich geht, bevor du ihn verwendest.
Oder du nutzt eine QMap, statt einem Array. Als Key kann ein QChar herhalten.
was genau meinst du? wie nehme ich utf-8
wie mach ich diese ausgaben?