2012-06-18 4 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

문자열을 만들려는 경우 문자 시퀀스가 ​​null 문자 \0으로 끝나야합니다. 즉

: 문자열이 끝나는 printf 같은 문자열에없이

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

, 함수는 알 수 없습니다.

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

c [m]이 '유효한'char 배열 만 생성하는 한, 이것은 빈 char 배열을 제공하지 않습니다. 물론, strlen (c) == 0이 유효성의 기준으로 간주된다면. –

2

나는 그 문자열을 해석하려고하는 디버거라고 생각합니다. char 배열을 사용하여 C 또는 C++에서 문자열을 나타낼 때는 문자열 끝에 null 바이트를 포함해야합니다. 따라서 m + 1 문자를 c에 할당 한 다음 c[m] = '\0'으로 설정하면 디버거에서 기대하는 값을 제공해야합니다.

+0

그는 자신의 의견에이 문자열을 인쇄하려고하고 있다고 말했습니다. –

+0

오, 내가 대답 할 때 거기에 없었습니다. 그러나 솔루션은 동일하게 유지됩니다. –

3

힙 배열을 만들면 OS가 초기화하지 않습니다. 이렇게하려면 다음 옵션을 사용하십시오.

  1. 배열을 정적 또는 전역으로 할당하십시오. 배열은 자동으로 0으로 채워집니다.
  2. 힙 초기화 또는 스택 배열에 ::memset(c, 0, m);을 사용하여 0으로 채 웁니다.
  3. std :: string과 같은 상위 수준 형식을 사용하십시오. 당신이 동적으로 할당 된 문자열을 원하는 경우에
1

후 가장 좋은 방법은 표준 라이브러리에서 string 클래스를 사용하는 것입니다

#include <string> 

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

C 문자열이 널 (null) 종료됩니다. 즉, 마지막 문자는 널 문자 ('\ 0'또는 0 만) 여야합니다.

문자열을 조작하는 함수는 배열의 시작 부분 (매개 변수로 전달 된 배열의 첫 번째 위치)과 null 값 사이의 문자를 사용합니다. 배열에 null 문자가 없으면 함수는 메모리 누수를 찾을 때까지 메모리를 반복합니다. 그래서 당신의 예에서 쓰레기가 인쇄 된 것입니다.

printf("Hello");과 같이 코드에 리터럴 상수가 있으면 길이가 6 인 char 배열로 변환됩니다 ('H', 'e', ​​'l', 'l', 'o' \ 0 ');

물론 이러한 복잡성을 피하기 위해 std :: string을 사용할 수 있습니다.