Переполнение строки в C ++? Этот непрерывный писк странный - PullRequest
0 голосов
/ 25 ноября 2010

Я начинаю разработку на генераторе ненужных файлов, но по какой-то причине, если я буду использовать большое число, оно будет издавать бесконечный звуковой сигнал, пока файл не закончится, я думаю, что где-то в таблице ascii есть символ \, или переполняется и выдает звуковой сигнал. Кто-нибудь хочет объяснить, почему эта штука кричит на меня?

#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;
}

Похоже, в этот момент символы в конце получаются в порядке, но он записывает только 1/4 из них в текстовый файл. Кто-нибудь знает почему?

Ответы [ 5 ]

7 голосов
/ 25 ноября 2010

i = rand ()% 255 + 32;

Вы, вероятно, хотите, чтобы это было что-то вроде:

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

Вы также действительно хотите избавиться от этого:

#define print cout<<

Как есть, когда (не если) тот, кто оценивает вашу домашнюю работу, решаетчтобы убить тебя, он (она?) почти наверняка будет признан невиновным в убийстве на том основании, что это была самооборона.

2 голосов
/ 25 ноября 2010

Ты хотел сказать

i = rand() % 223 + 32;
2 голосов
/ 25 ноября 2010

Я думаю, что где-то в таблице ascii есть символ

Да, я верю, что это позиция 7.

Также это:

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

должно быть так:

 for(; numberof > 0; numberof--)

Условие идет в середине , и вам не нужно никакой инициализации, следовательно, пустой оператор в начале цикла for.

Кроме того, печатаемые символы ASCII варьируются от 32 до 126, поэтому вы должны написать:

i = rand() % 95 + 32;

Кроме того, крайне неэффективен, так как каждый раз генерирует новый строковый объект:

charlist=charlist+charvalue

Сделайте это вместо:

charlist.push_back(charvalue);
1 голос
/ 25 ноября 2010

Тот факт, что вы печатаете весь список символов каждый раз, означает как можно быстрее, что означает, что, как только вы генерируете в выходной строке как минимум пару \a символов (шансы которых не так уж и плохи), вы получите только непрерывный гудок.

0 голосов
/ 25 ноября 2010

Удалите print charlist, чтобы не печатать символы звонка.

...