char als int - speicherzugriffsfehler

Dieses Thema im Forum "C/C++" wurde erstellt von sim4000, 18.02.2007.

  1. #1 sim4000, 18.02.2007
    sim4000

    sim4000 Lebende Foren Legende

    Dabei seit:
    12.04.2006
    Beiträge:
    1.933
    Zustimmungen:
    0
    Ort:
    In meinem Zimmer
    guten Tag.

    Wir haben in der Schule jetzt seit 2 Wochen in C++ die Caesar-verschlüsselung. Dazu sollen wir ein Programm schreiben, was eine statistische analyse mit dem chiffrierten Text macht. Dazu sollen wir Zeichen für zeichen zählen. Und zwar folgender maßen:
    Jedes einzelne Zeichen des Textes wird in einen int ungewandelt (ASCII). Dieser Wert hat ein gleichnamiges Feld in einem Array. Dieses wird dann mit ++ um 1 erhöht. Damit weiss man denn am ende welches Zeichen in dem Text am meisten vor kommt.
    Nun zu meinem Problem:
    Bei der Umwandlung kommen auch negative werte herraus. Dann kann natürlich nicht das passende Feld gefunden werden, und es gibt einen fehler.
    Ich habs bissher so gemacht:
    Code:
       char c;
       int integer;
       unsigned array[255];
       while(eingabe >> c) {
          integer = (int)c;
          array[integer] = array[integer] + 1;
       }
    
    Aber es kommen wie schon gesagt immer mal wieder negative Werte vor, die nicht zugeordnet werden können. Hat wer ne idee wie mans noch anders machen kann?

    Mfg, sim4000.
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 Mµ*e^13.5_?¿, 18.02.2007
    Mµ*e^13.5_?¿

    Mµ*e^13.5_?¿ Routinier

    Dabei seit:
    21.02.2006
    Beiträge:
    453
    Zustimmungen:
    0
    Klappts nicht auch ohne den integer?
    Code:
    #include <iostream>
    using namespace std;
    
    int main ()
    {
    	char c;
    	unsigned array[256];
    	for (int i = 0; i < 255; i++) {
    		array[i] = 0;
    	}
    	while(cin >> c) {
    		array[c] = array[c] + 1;
    	}
    	for (int i = 0; i < 255; i++) {
    		if (array[i] != 0) {
    			cout << (char)i << array[i] << endl;
    		}
    	}
    };
    Soweit ich sehe läuft das bei mir..
     
  4. #3 sim4000, 18.02.2007
    sim4000

    sim4000 Lebende Foren Legende

    Dabei seit:
    12.04.2006
    Beiträge:
    1.933
    Zustimmungen:
    0
    Ort:
    In meinem Zimmer
    Das problem ist nur, ich brauche den int-wert zum zurück rechnen.
    Caesar-verschlüsselung ist doch jeden buchstaben um einen wert zu verschieben.
    Und um die Nachricht zu endschlüsseln, brauche ich die int-werte der buchstaben.

    Und in dem Struktogramm von meinem Lehrer was er uns gegeben hat, ist das so erklährt. In der Klausur muss es auch so sein.

    Mfg, sim4000.
     
  5. #4 huntings, 18.02.2007
    huntings

    huntings Mitglied

    Dabei seit:
    17.02.2006
    Beiträge:
    39
    Zustimmungen:
    0
    Wie wäre es mit Modulo?

    Code:
    char c;
    int integer;
    unsigned array[255];
    while(eingabe >> c) {
       integer = (int)c;
       integer = (integer + 256) %  256;
       array[integer] = array[integer] + 1;
    }
    So dürften keine negativen Werte mehr vorkommen.
     
  6. Xanti

    Xanti Mouse Organist

    Dabei seit:
    05.09.2004
    Beiträge:
    1.855
    Zustimmungen:
    0
    Wie bereits erwähnt, werden die Buchstaben in ihren Wert in der ASCII-Tabelle umgewandelt. Es kann also garnicht negativ werden, wenn es echte ASCII-Zeichen sind. Vielleicht solltest Du die Chars angeben, die negative Integer erzeugen.
     
  7. #6 Schneemann, 18.02.2007
    Zuletzt bearbeitet: 18.02.2007
    Schneemann

    Schneemann Routinier

    Dabei seit:
    27.06.2006
    Beiträge:
    289
    Zustimmungen:
    0
    Ort:
    /home/janosch
    Hi,

    hab jetzt nicht alles gelesen, aber das hier ist meine Lösung:
    Code:
    #include <stdio.h>
    
    int main(int argc, char *argv[]) {
      char *code;
      unsigned int letters[255];
      int i;
      for (i=0;i<255;i++) letters[i] = 0;
    
      printf("Enter the code: ");
      scanf("%s",code);
    
      i = 0;
      while (code[i]!=0) {
        letters[code[i]]++;
        i++;
      }
      for (i=0;i<255;i++) {
        if (letters[i]>0) printf("%c (%X): %i\r\n",i,i,letters[i]);
      }
      return 1;
    }
    
    EDIT: Also erstmal um den meist benutzen Buchstaben zu bekommen.
    
    
     
  8. #7 Mµ*e^13.5_?¿, 18.02.2007
    Mµ*e^13.5_?¿

    Mµ*e^13.5_?¿ Routinier

    Dabei seit:
    21.02.2006
    Beiträge:
    453
    Zustimmungen:
    0
    Nö, es wird wohl eher daran liegen, dass der Code Murks ist.
    Wenn man eine unbestimmte Menge von Zeichen (gets) einfach so auf gut Glück irgendwohin (char *code) in den Speicher schreibt kann das gar nicht gut gehen.
    Man braucht schon Platz wo die Daten hinkommen sollen.
    Entweder man legt die Grösse vorher fest (char code[123]) und schreibt dann da auch nicht mehr rein als geht (fgets(code,123,stdin)) oder man macht es mit malloc zur Laufzeit, aber irgendwo muss man dafür unbenutzten Speicher herbekommen..
     
  9. rikola

    rikola Foren Gott

    Dabei seit:
    23.08.2005
    Beiträge:
    2.133
    Zustimmungen:
    0
    Wie schon Xanti meinte, sollte c nie negativ werden. Kann es sein, dass der Text Umlaute o.ae. enthaelt? Dann versuche es doch mal mit unsigned char statt mit char. Wenn Du ein 'ae' (Umlaut) in ein char einliest, wird das sicher negativ, weil es die oberen 128 bit belegt.

    Ausserdem kannst Du mit char genauso rechnen wie mit int, der Kompiler macht da nur bei der Ausgabe einen Unterschied.
     
  10. #9 sim4000, 18.02.2007
    sim4000

    sim4000 Lebende Foren Legende

    Dabei seit:
    12.04.2006
    Beiträge:
    1.933
    Zustimmungen:
    0
    Ort:
    In meinem Zimmer
    Also. Im moment siehts so aus:
    Code:
    void caesar::analysis(void) {
       char c;
       int integer;
       unsigned array[256];
       while(eingabe >> c) {
          integer = (int)c;
          integer = (integer + 256) %  256;
          array[integer] = array[integer] + 1;
       }
       cout << endl;
    };
    Das mit dem unsigned char und mit dem modolo hab ich probiert, leider ohne erfolg. Zum Thema sonderzeichen: Es sollen wirklich alle zeichen verarbeitbar sein. Man muss halt alle Zeichen verschlüsseln, endschlüssen (die beiden funzen schon) und knacken (da bin ich grad) können.

    Lg, sim4000.
     
  11. #10 Schneemann, 19.02.2007
    Schneemann

    Schneemann Routinier

    Dabei seit:
    27.06.2006
    Beiträge:
    289
    Zustimmungen:
    0
    Ort:
    /home/janosch
    Hi,

    Ich dachte scanf speichert einen String und der würde doch eigentlich mit 0 enden. Deswegen while (code!=0), also bei mir geht das Zeichen zählen. Ich hab es allerdings mit C und nicht mit C++ kompiliert.
     
  12. rikola

    rikola Foren Gott

    Dabei seit:
    23.08.2005
    Beiträge:
    2.133
    Zustimmungen:
    0
    Was ist denn 'eingabe' fuer ein stream bei Dir?
    Und was fuer eine negative Zahl bekommst Du, koenntest Du das mal angeben?
    Ein unsigned char kann nur Werte zwischen 0 und 255 annehmen, d.h., wenn Du 'c' als 'unsigned char' deklarierst, _KANN_ nichts Negatives dabei rauskommen. Ich vermute daher, dass der Fehler muss woanders liegt.
     
  13. Xanti

    Xanti Mouse Organist

    Dabei seit:
    05.09.2004
    Beiträge:
    1.855
    Zustimmungen:
    0
    Hat jetzt nix direkt mit dem Problem zu tun, ich wollte aber nur noch etwas zu Modulo sagen: es ist keine injektive (eindeutige) Abbildung, deswegen absolut ungeeignet für diese Aufgabe, da die Umkehrabbildung in diesem Fall nicht existiert.
     
  14. rikola

    rikola Foren Gott

    Dabei seit:
    23.08.2005
    Beiträge:
    2.133
    Zustimmungen:
    0
    Nicht unbedingt, das kommt auf die Wertemenge drauf an. U.U. kann die modulo-Funktion dann bijektiv sein. Was dann allerdings in diesem Fall nur unnoetigen Rechenaufwand bedeutet.
     
  15. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  16. #14 supersucker, 19.02.2007
    supersucker

    supersucker Foren Gott

    Dabei seit:
    21.02.2005
    Beiträge:
    3.873
    Zustimmungen:
    0
    Lasse mich da gerne korrigieren, aber IMHO hat die Wertemenge keinen Einfluß darauf, ob man eine Funktion als injektiv oder bijektiv oder sonstwas bezeichnet.

    Eine Funktion ist injektiv oder halt eben nicht.
     
  17. #15 Xanti, 19.02.2007
    Zuletzt bearbeitet: 19.02.2007
    Xanti

    Xanti Mouse Organist

    Dabei seit:
    05.09.2004
    Beiträge:
    1.855
    Zustimmungen:
    0
    @rikola

    Yep, hast recht. Wenn man keine große Ahnung von Algebra hat, sollte man die Klappe halten. ;)

    Auch die Aussage, "nicht injektiv -> keine Umkehrfunktion" ist Quatsch. Diese kann schon existieren, ist aber nicht surjektiv auf dem ursprünglichen Def.-Bereich. Z. B. Quadrat und Wurzel...

    edit: @supersucker

    bijektiv = injektiv+surjektiv. Und für surjektiv ist der Wertebereich schon wichtig. ;)
     
Thema:

char als int - speicherzugriffsfehler

Die Seite wird geladen...

char als int - speicherzugriffsfehler - Ähnliche Themen

  1. Richard Stallman erhält ACM-Preis für Softwaresysteme

    Richard Stallman erhält ACM-Preis für Softwaresysteme: Die Association for Computing Machinery hat GNU-Gründer Richard Stallman den Preis für Softwaresysteme 2015 zuerkannt. Stallman erhält den...
  2. Richard Stallman gibt Emacs-Projektleitung ab

    Richard Stallman gibt Emacs-Projektleitung ab: Wie der Richard Stallman in einer E-Mail an die Liste des Projektes bekannt gab, gibt er Leitung des Projektes ab. Der neue Maintainer wird mit...
  3. Richard Stallman in Frankfurt

    Richard Stallman in Frankfurt: Richard Stallman, der Gründer von GNU und der Free Software Foundation, wird Anfang des kommenden Monats zwei Vorträge in Frankfurt am Main...
  4. Vor 30 Jahren veröffentlichte Richard Stallman das GNU-Manifest

    Vor 30 Jahren veröffentlichte Richard Stallman das GNU-Manifest: Das GNU-Manifest legte 1985 die Ziele einer Bewegung fest, die sich der Kommerzialisierung von Unix widersetzte und ein freies Betriebssystem...
  5. MakeHuman - Freie Charaktergenerierung in der Version 1.0 erschienen

    MakeHuman - Freie Charaktergenerierung in der Version 1.0 erschienen: MakeHuman, eine freie Anwendung zur Erstellung von humanoiden 3D-Charakteren, ist nach Jahren der Entwicklung in der Version 1.0 veröffentlicht...