2012-06-18 3 views
1

мне нужен пустой массив символов, но когда я пытаюсь сделать вещи, как это:массив проблема инициализации

char *c; 
c = new char [m]; 
int i; 
    for (i = 0; i < m; i++) 
    c[i] = 65 + i; 

, а затем распечатать c. может видеть, что c = 0x00384900 "НННННННээээ««««««««юоюою" после цикла становится: 0x00384900 "ABCDEFGээээ««««««««юоюою" Как я могу решить эту проблему? Или, может быть, есть путь со строкой?

+1

Что вы пытаетесь достичь? И что означает «пустой массив символов»? – akappa

+0

какой выход вы ожидаете? Вы пытаетесь создать строку, которую вы можете распечатать, например. с printf? – pb2q

+0

Мне нужна строка, а затем напечатайте ее – mishkapp

ответ

3

Если вы пытаетесь создать строку, вам необходимо убедиться, что последовательность символов завершена нулевым символом \0.

Другими словами:

char *c; 
c = new char [m+1]; 
int i; 
    for (i = 0; i < m; i++) 
    c[i] = 65 + i; 
c[m] = '\0'; 

Без него функции на строках, как printf не будет знать, где строка заканчивается.

printf("%s\n",c); // should work now 
+0

Это не даст пустой массив символов, если c [m] создает только «правильный» массив символов. Конечно, если критерий справедливости равен strlen (c) == 0. –

2

Я считаю, что ваш отладчик пытается интерпретировать строку. При использовании массива char для представления строки на C или C++ вам нужно включить нулевой байт в конце строки. Итак, если вы выберете m + 1 символов для c, а затем установите c[m] = '\0', ваш отладчик должен дать вам ожидаемое значение.

+0

Он говорит, что пытается напечатать строку в своем комментарии. –

+0

О, этого не было, когда я ответил. Однако решение остается тем же. –

3

Если вы создаете массив кучи, ОС не будет инициализировать его. Для этого у вас есть следующие варианты:

  1. Выделить массив статически или глобально. Массив будет заполнен нулями автоматически.
  2. Используйте ::memset(c, 0, m); в массиве с инициализацией или стеком, чтобы заполнить его нулями.
  3. Используйте типы высокого уровня, такие как std :: string.
1

Если вы хотите динамически выделенную строку, то лучшим вариантом является использование string класса из стандартной библиотеки:

#include <string> 

std::string s; 
for (i = 0; i < m; i++) 
    s.push_back(65 + i); 
0

C строки нулем. Это означает, что последний символ должен быть нулевым символом ('\ 0' или просто 0).

Функции, которые управляют вашей строкой, используют символы между началом массива (которые вы передали как параметр, первая позиция в массиве) и нулевое значение. Если в вашем массиве нет нулевого символа, функция будет перебирать свою память до тех пор, пока не найдет ее (утечка памяти). Вот почему в вашем примере напечатан мусор.

Когда вы видите в своем коде литеральную константу, например printf("Hello");, она преобразуется в массив символов длиной 6 ('H', 'e', ​​'l', 'l', 'o' и ' \ 0');

Конечно, чтобы избежать такой сложности, вы можете использовать std :: string.

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