2016-06-11 4 views
0

c에서 틱택 막 발가락 게임을 만들려고 혼란스러워집니다. 나는 보드를 만들기 위해 8 개 요소의 단일 문자 배열을 사용하는 책을 따라 가고있다. 나는 배열이 9 개의 원소를 가지고 있다는 것을 안다. 그러나 만일 배열이 char 배열로 선언 되었다면, 빈 보드를 만들기위한 공간을 포함해야하기 때문에 array [9]가되어서는 안된다. 9 문자와 null 문자 '\ 0'을 포함합니까? 널을 배열로 만들어야한다는 것을 이해하고 있기 때문에 보드를 2 차원 배열로 변환 할 때 같은 의문을 품고있다. 그러나 이것을 char로 선언하고 싶다면, null 문자입니까?인공 타크 발가락 게임에서 2 차원 캐릭터 배열 초기화

+0

로 이동 . – wrangler

+0

8 문자의 배열은 8 문자를 포함합니다. C 스타일의 문자열을 언급 할 때 char * str = "hello"라고 말하면 여분의 '\ 0'을위한 공간을 남겨 둘 필요가있을 때입니다. – StaticBeagle

+0

"배열 [8]에 9 개의 요소가 있음을 알고 있습니다". 아니, 8 개의 요소가 포함되어 있습니다. 너는 왜 달리 믿는가? –

답변

0

문자열을 저장하기 위해 문자 배열을 사용하는 경우 종료 영 (zero)이 필요합니다.

작업의 경우 배열에 문자열을 저장할 필요가 없습니다.

그래서 C에서는, 3 × 3 배열을 예를 들면 다음과 같은 방법

char board[3][3] = 
{ 
    " ", // three spaces 
    " ", 
    " " 
}; 

가 리터럴 스트링 초기화되지만 착신 0을 포함하지 않을 어레이의 각 요소를 선언 할 수있다.

반면에 이러한 배열을 출력하는 것이 더 간단하다고 생각되면 각 요소에 종료 영점을 포함 할 수 있습니다. 이 경우, 배열

배열 [8] 9 개 원소

다음 배열 정확히 팔을 갖는 것으로 선언을 포함 명세서로서는

char board[3][4] = 
//   ^^^ 
{ 
    " ", // three spaces 
    " ", 
    " " 
}; 

같이 정의되어야 집단. :) 문자열 리터럴이라고 생각합니다. 예를 들어 C의 문자열 리터럴 "Hi"은 리터럴에 저장된 종료 영 (zero)으로 인해 유형이 char[3]입니다.

0

2D 배열은 기본적으로 프로그래머가 사용하기 쉬운 1D 배열입니다. 읽은 책은 아마 셀에 값을 저장하고, 당신이 말했듯이 문자열 대신 문자를 문자열로 표시합니다. 이것은 보드 전체를 문자열로 저장하는 것보다 훨씬 효율적입니다.

4x4 영역의 2D 배열을 저장한다고 가정합니다. 당신은 크기 16의 1 차원 배열로 표현 및 액세스 모든 인덱스과 같이 할 수 있습니다.

arr[j + i * 4] 
당신이 4 단위 블록에 있고, 내가 4 단위 블록 당신이 무엇이고 J는

또한 크기 [8]의 배열에는 8 개의 요소가 있습니다. 예 :

char arr[8]; // has 8 elements, not 9 
0

나는 배열 [8] 9 개 요소

아니,되어야하는 이유를 포함 알아? int arry[8]과 같이 정의 된 배열은 8 개의 요소 만 포함합니다. 그것도 C에서 배열 색인은 0을 기반으로하므로 위의 배열에 대해 array[0] ~ array[7] 만 유효한 액세스가됩니다.

즉, char 배열의 경우 문자열으로 사용되며 null 종결 자의 공간도 있어야합니다. 따라서 char 개의 요소 9 개를 배열하고 문자열으로 사용하려면 char[10]으로 정의해야합니다.

0

문자를 배열의 값으로 사용하는 것은 char 배열이 포인터 char*으로 감쇠되고 NUL 종료 문자열로 해석 될 수 있다는 사실과 아무런 관련이 없습니다.

문자열이 C에 특정 유형을 가지고 있지 않습니다. 일부 데이터를 해석하는 방법 일뿐입니다. 그래서 두 가지 개념을 혼합하고 있습니다.

char 배열은 문자열로 데이터를 사용합니다 기능을 사용하려는 경우는 NUL 종료를 필요 NUL 종료 할 필요가 없습니다.

char board[3][3]을 갖는 것은 9 자리 요소를위한 공간을 가지고 있으며, 그 데이터를 문자열로 사용하지 않으므로 \0이 필요하지 않습니다.

1

문자 배열은 모든 위치의 값을 유지할 수 있습니다. 문자열의 끝에 NUL 문자 (0이 아니라 '0'이 아님)가 있는지 확인하는 데 필요한 특정 기능 만 사용하려는 경우 - 처리를 중지 할 때 함수에 알립니다!

그래서 : - 그것은 0 값을 찾을 때까지이 계산을 유지하기 때문에 그냥 strlen()john를 통과하지 않고, 배열에있는이 없습니다 char john[4] = { 'J', 'o', 'h', 'n' };은 완벽하게 합법적입니다! 또한

: char tictactoe[3][3];은 어디서나 0을 필요로하지 않는다 - 당신이 어떤 이유로 printf()전체 배열을 전달하려고하지 않는 한 ... 안전하게 다음과 같은 작업을 수행 할 수

참고 :

printf(" %c | %c | %c \n", tictactoe[0][0], tictactoe[0][1], tictactoe[0][2]); 
printf("---+---+---\n"); 
printf(" %c | %c | %c \n", tictactoe[1][0], tictactoe[1][1], tictactoe[1][2]); 
printf("---+---+---\n"); 
printf(" %c | %c | %c \n", tictactoe[2][0], tictactoe[2][1], tictactoe[2][2]); 

%c을 사용하면 "문자 한 줄 인쇄"가 아니라 "한 문자 인쇄"를 의미하기 때문에.

NUL로 끝나는 문자열 형식은 종종 ASCIIZ (ASCII-Zeroed) 문자열이라고도하며 9 문자 배열에 8 문자 문자열 만 저장할 수있는 이유입니다. 고 말했다.) NUL을 유지하려면 아홉 번째가 필요하다.

는 그리고, 항상 C에서, 어떤 배열은 0에서 길이 1, 따라서 내 예에서 [0], [1][2] 당신은 문자열과 문자 배열의 차이를 알고 있다면 당신이 그것을 알아 낸 것