2010-11-24 5 views
0

Ich bin in der Entwicklung auf einem Junk-Datei-Generator, aber aus irgendeinem Grund, wenn ich eine große Zahl verwenden wird es unendlich piepsen, bis die Datei fertig ist, ich denke, es gibt ein Zeichen irgendwo in die ASCII-Tabelle, oder es ist überfüllt und verursacht einen Fehlerton. Wer möchte erklären, warum dieses Ding mich anschreit?Stringüberlauf in C++? Dieses unaufhörliche Piepen ist seltsam

#include <string> 
#include <iostream> 
#include <cstdio> 
#include <cstdlib> 
#include <fstream> 
#include <time.h> 
#include <windows.h> 
#define print cout<< 

using namespace std; 

int numberof,i; 
char charvalue; 
string charlist,filename; 

int main() 
{ 
    srand (time(NULL)); 
    print "What do you want the name of your file to be?(with a .txt extension)\n"; 
    getline(cin,filename); 
    print "\nHow many characters do you want?\n"; 
    cin>>numberof; 

    for(numberof>0;numberof!=0;numberof--) 
     { 
     i = rand() % 255 + 32; 
     charvalue=i; 
     charlist=charlist+charvalue; 
     print charlist; 
     } 

    ofstream writefile(filename.c_str()); 
    writefile<<charlist; 
    writefile.close(); 
    ShellExecute(NULL, "open", filename.c_str(), NULL, NULL, SW_SHOWNORMAL); 
    return 0; 
} 

scheint an dieser Stelle wie die Charaktere in Ordnung am Ende herauskommen, aber es schreibt nur ein Viertel von ihnen in die Textdatei. Wer weiß warum?

+2

"unendlich, bis die Datei fertig ist". Dieses Wort, "unendlich", ich glaube nicht, dass es bedeutet, was du denkst, dass es bedeutet. – abelenky

+3

@abelenky: Suche nach dem bösen '# define'. – aschepler

+0

gut, abelenky, nach oben schauen. #define print cout << –

Antwort

2

Ich denke, es ist ein \ ein Zeichen irgendwo in der ASCII-Tabelle

Ja, es in Position 7, glaube ich.

Auch dies:

for(numberof>0;numberof!=0;numberof--) 

sollte dies sein:

for(; numberof > 0; numberof--) 

Der Zustand geht in der Mitte, und Sie brauchen keine Initialisierung, damit die leere Anweisung am Anfang der for-Schleife.

Auch die druckbaren ASCII-Zeichen reichen nur 32 bis 126, so sollten Sie schreiben:

i = rand() % 95 + 32; 

Auch die folgende ist extrem ineffizient, da es jedes Mal ein neues String-Objekt erzeugt:

charlist=charlist+charvalue 

tun Sie dies statt:

charlist.push_back(charvalue); 
+0

http://www.asciitable.com/ –

+0

@Brent: Yay, ich hatte Recht :) – fredoverflow

+0

Also nur ein "wenn", wenn Sie \ a, fügen Sie es nicht auf die Liste. –

2

Sie bedeuten

i = rand() % 223 + 32; 
7

i = rand()% 255 + 32 zu sagen;

Sie wollen wahrscheinlich dies wie etwas sein:

i = rand()% (255-32) + 32;

Sie auch wirklich wollen dies loszuwerden:

#define print cout<< 

Wie es aussieht, wenn (nicht falls) wer auch immer Ihre Hausaufgaben Einstufung entscheidet, dich zu töten, er (sie?) Wird mit ziemlicher Sicherheit wegen Mordes nicht für schuldig befunden werden, weil es Selbstverteidigung war.

+1

Ich denke, dass das Druck-Ding einen Seg-Fehler in meinem eigenen Gehirn verursachte, als ich es das erste Mal sah. –

+0

Ich komme aus Python, und das ist nicht für Hausaufgaben. Ich sehe nicht, warum ich nicht sollte:/ –

+0

Genau das, was ich brauchte, danke Jerry! : D –

1

Die Tatsache, dass Sie die gesamte charlist jedes Mal drucken bedeutet so schnell wie Sie können bedeutet, dass, sobald Sie mindestens ein paar \a Zeichen in der Ausgabezeichenfolge generieren (die Chancen, die nicht zu schlecht sind) Du wirst nichts als unaufhörliches Piepen bekommen.

+0

Aber ich habe die Zufallszahlen auf 32 und darüber begrenzt, es sei denn, ich habe etwas falsch gemacht ... habe ich? –

+0

@ssen: ja. Siehe meine Antwort (oder @ Cababunga). –

0

Entfernen Sie die print charlist, damit Sie die Bell-Zeichen nicht ausdrucken.