Почему мой динамический массив символов Char по-прежнему возвращает неинициализированные значения? - PullRequest
2 голосов
/ 20 августа 2011

По какой-то странной причине он продолжает создавать неинициализированные значения, когда я передаю длину как 12, он создает массив из 16 и сохраняет остальное с дерьмом, которое мне не нужно. Кто-нибудь знает, почему это не работает? Это для назначения, которое должно быть завтра, и это моя последняя проблема ... Любая помощь будет признательна, спасибо.

char * convertToUppercase (char* toUpSize, int length) {
    std::cout << "ToUpsize: " << toUpSize << "\nLength: " << length << "\n";
    char * upsized = new char[length];
    for (int i = 0; toUpSize[i]; i++) {
        upsized[i] = toupper(toUpSize[i]);
    }
    return upsized;
}

Ответы [ 4 ]

4 голосов
/ 20 августа 2011

Я думаю, что вы либо пишете i< length в цикле for вместо toUpSize[i] как:

 for (int i = 0; i < length; i++) {
    upsized[i] = toupper(toUpSize[i]);
 }

Или передайте toUpSize в виде строки с нулевым символом в конце, если вы хотите написать toUpSize[i] в условии цикла for. Если вы сделаете это, то вы должны поставить \0 в конце upsized после выхода из цикла, в индекс i, для которого toUpSize[i] равно \0. И для этого вам нужно переместить определение i за пределы цикла for, чтобы вы могли использовать его после выхода из цикла.

Строка с нулевым символом в конце - это то, что имеет символ \0 в конце строки.

char x[]  = {'N', 'a', 'w', 'a', 'z' };
char y[]  = {'N', 'a', 'w', 'a', 'z', '\0' };

Здесь x является , а не строкой с нулевым символом в конце, но y является строкой с нулевым символом.

Если строки определены как:

char z[] = "Nawaz";
const char *s = "Nawaz";

Здесь z и s - строка с нулевым символом в конце, потому что они оба созданы из «Nawaz», который является строкой с нулевым символом в конце. Обратите внимание, что sizeof("Nawaz") вернет 6, а не 5, именно потому, что в конце строки стоит \0.

2 голосов
/ 20 августа 2011

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

0 голосов
/ 20 августа 2011

Почему вы вообще беспокоитесь об указателях символов?Это C ++, а не C.

#include <string>
#include <algorithm>
#include <cstring>
#include <iostream>

std::string to_upper_case(std::string str)
{
    std::transform(str.begin(), str.end(), str.begin(), toupper);
    return str;
}

int main()
{
    std::cout << to_upper_case("hello world\n");
}

Если вы решили придерживаться решения C, зарезервируйте еще один символ для терминатора NUL и поместите его туда:

char * upsized = new char[length + 1];   // note the +1
upsized[length] = 0;
0 голосов
/ 20 августа 2011

Вам необходимо добавить символ завершения:

char * convertToUppercase (char* toUpSize, int length) {
   std::cout << "ToUpsize: " << toUpSize << "\nLength: " << length << "\n";
   char * upsized = new char[length];
   int i;
   for (i = 0; toUpSize[i]; i++) { // stops when you get toUpSize[i]==0
       upsized[i] = toupper(toUpSize[i]);
   }
   upsized[i] = '\0'; //add termination
   return upsized;
}

Ваш код предполагает, что length - это длина выделенного массива, а не длина строки. strlen(toUpSize) считает символы, которые не '\ 0' с позиции 0 в toUpSize.

Например: strlen ("abc \ 0def") -> 3 sizeof ("abc \ 0def") -> 8!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...