2010-05-26 6 views
2

Я пытаюсь стать лучше на C++ (знаю немного). Я работаю над массивами символов. Я нашел упражнение, целью которого является изменение массива символов (после преобразования его из целого числа). Я получаю следующую ошибку (с использованием VS2005):Ошибка при попытке изменить массив символов

Ошибка проверки времени выполнения # 2 - Урон вокруг переменной revBuffer был поврежден.

Когда я пошагово код, я заметил следующее:

revBuffer = 0x0012fe40 "100899ÌÌÌÌÌÌÌÌÌÌ998001"

Соответствующий код находится ниже.

char buffer[5]; 
    char revBuffer[5]; 
    int i; 
    int j=5; 
    long number = 998001; 

    itoa(number, buffer, 10); 

    for(i=0; i<strlen(buffer);i++) 
    { 
     revBuffer[j] = buffer[i]; 
     j--; 
    } 

Любая помощь будет замечательной. ТИА!

+0

Просто проследить через код - смотрите на значения индексов, будем будет использоваться в первой итерации цикла for. – Cascabel

+2

Не связано с вашей ошибкой, но вы должны вытащить 'strlen (buffer)' из выражения цикла for for, чтобы он не вычислялся без необходимости в каждом цикле. 'strlen' работает, просматривая всю строку до тех пор, пока не увидит нулевой ограничитель. Я думаю, что оставить «strlen» в цикле будет формой «преждевременной пессимизации» (IMHO). –

+0

@Emile Преждевременная пессимизация, ха-ха. – WhirlWind

ответ

7

Вы чрезмерно инвертируете revBuffer. Это размер 5, что означает, что вы можете индексировать его с 0 до 4, но первый индекс, который вы используете в нем в вашем цикле, равен 5.

+0

Черт. Это была глупая ошибка с моей стороны. Все ответы и предложения были большой помощью. Этот сайт скалы! Благодаря! –

6

Число, которое вы конвертируете, имеет шесть цифр - буфер, который вы используете, достаточно большой, чтобы удерживать 4 плюс нулевой ограничитель. Сделайте буфер больше.

2

В то время как ваш Excercise полезно вы должны иметь в виду, что существует также:

std::reverse(buffer, buffer + 5); 
0

Для начала, вы пытаетесь использовать буфер, что это 5 символов для хранения 6-значный номер.

2

В дополнение к тому, что говорили другие, не кажется, что нулевой ограничитель будет помещен в последний символ revBuffer даже после устранения всех ваших проблем с индексацией. Вы должны быть уверены, чтобы сделать

revBuffer[strlen(buffer)] = '\0'; 

Это также frought с проблемами, поскольку предполагается, что буфер правильно заделан :)

Смежные вопросы