2012-01-13 4 views
1

나는 C++에 대한 지식이있는 주로 Java 사람이므로 C 언어에는 익숙하지 않으므로 사소한 질문 인 경우 용서해주십시오. 온라인 검색 중에 답변을 찾을 수없는 것 같습니다. 내가 char 배열을 초기화하고있어Char x [50] and Char x [100] 출력

... 나는 CONST 문자와 문자를 연결할 수 있도록

char tcp[50]; 

. 예제에서 나는 이것을하기위한 쉬운 방법을 보았습니다. 빈 문자 배열을 생성 한 다음 그것을 사용하여 ...

strcat(x,y); 

함께 붙여야합니다.

문제는이 "50"로 설정되어있을 때 빈 char 배열을 인쇄 인 나에게 결과 제공합니다 ... 나는 그것을 변경하는 경우

X??|? 

char tcp[100]; 

그리고 그것의 공백을 인쇄하십시오. 왜 이런거야?

+1

c에서 널 (0x0) 문자로 문자열을 명시 적으로 종료해야합니다. – StuartLC

+0

죄송합니다, "const char 및 char 연결"무엇입니까? 그것은이 맥락에서 이해가되지 않는 것 같습니다. 또한, 뭔가를 strcatting하기 전에 tcp 배열을 초기화 하시겠습니까? –

+0

const char의 내용을 편집 할 수 없으므로 빈 배열의 다른 char과 결합하려고합니다. 적어도 그것은 계획이었습니다. – Max

답변

7

배열 내용은 로컬 (자동) 배열이라고 가정하고 정의되지 않습니다.

사용 :

char tcp[50] = ""; 

또는 :

char tcp[50] = {0}; 

또는 :

char tcp[50]; 
tcp[0] = 0; 

또는 : 예로서

char tcp[50]; 
memset(tcp, 0, sizeof(tcp)); 

같은.

1

항상 아무것도하기 전에 당신에게 문자 배열을 종료 널 (null) :

tcp[0] = '\0'; 
1

C가 행복하게 선언 배열을위한 공간을 할당을하지만, 따라서 0

에 내용을 내용을 설정하지 않습니다 인쇄하려는 배열의 배열이 무작위입니다 (또는 메모리의 이전 내용에 따라 다름)

1

배열을 만들 때 컴파일러는 메모리에 배치하지만 초기화하지 않습니다. 프로그램은 st이다. arted는 초기 "문자열"이됩니다.

char tcp[50] = { '\0' }; 

또는

char tcp[50]; 
/* ... */ 
tcp[0] = '\0'; 
+0

첫 번째 스 니펫에서는 다음 요소가 모두 0이기 때문에' '\ 0''은 의미가 없습니다. ''\ 1 ''이 첫 번째 요소 이니셜 라이저 인 경우 다음 요소는 여전히 0이됩니다. '{}'이 더 명확합니다. –

0

: 당신은 배열을 만든 후

수동 중 전체 배열을 만들어서을 문자열을 종료하는 것은 밖으로, 또는 단지 첫 번째 문자로 영을 넣어 "제로" 여기서 차이점은 기본적으로 두 개의 빈 배열을 하나의 메모리 공간에 병합하려고 시도하고 있다는 것입니다 (이것이 맞는지 확실하지 않음).

우선 C에서 \0으로 문자열을 종료해야합니다. 이는 Java에서 노출되거나 보이지 않는 것입니다. 또한 기본적으로 두 개의 정의되지 않은 문자열을 사용합니다 (값이 설정되지 않았으므로).

#include <stdio.h> 
#include <string.h> 

char target[256]; 
const char source_a[] = "Hello"; 
const char source_b[] = "World!"; 

int void(main) 
{ 
    target[0] = '\0'; // this essentially empties the string as we set the first entry to be the end. Depending on your language version of C, you might as well write "char target[256] = {'\0'};" above. 
    strcat(target, source_a); // append the first string/char array 
    strcat(target, " "); // append a const string literal 
    strcat(target, source_b); // append the second string 

    printf("%s\n", target); 

    return 0; 
} 

중요 :이 수행에는 길이 체크 없다, 자바 이외는,이 "문자열"고정 길이 (변수를 정의 할 때 설정 한)를 가지고 strcat()를 사용하면, unsave 수 있습니다. 길이가 지정되지 않았지만 초기화시 문자열을 복사하면 그 길이가 사용됩니다 (예 : char test[] = "Hello!";은 길이가 7 자 (\0 종료)).

문자열에 대해 더 많은 Java 방식을 사용하려면 C++과 std::string 클래스를 사용합니다.이 클래스는 Java 문자열과 훨씬 비슷합니다.