다음과
printf("%s\n", getr[1]);
첫 번째 행의 네 번째 문자를 인쇄 할 :
scanf(" %99s", getr[z]); //getr[z] is the address to take the 4 characters string
번째 행을 출력 할 당신의 예제 입력처럼 4-char 문자열을 저장하기 위해서는 null 문자를 끝내기위한 공간을 남기기 위해 5-char 배열이 필요하다 :
char getr[4][5];
scanf()
형식 문자열은 보유하고있는 공간의 양도 반영해야합니다. %99s
은 최대 100 바이트 (99 개의 문자와 null)를 읽을 수 있으며 사용자는 5 개 (위의 변경 후 null 포함) 만 가질 수 있습니다. 또한 &getr[z]
과 getr[z]
은 동일한 주소를 제공하지만 포인터의 유형은 다릅니다. 그러나 getr[z]
은이 경우에 char *
을 제공합니다. 그래서 ...
scanf(" %4s", getr[z]);
이러한 변화는 이미 개별 문자열이 getr[3]
통해 getr[0]
으로 액세스 할 수 있습니다, 함께 실행 문자열을 유지합니다. 문자열 내에서 개별 문자를 인쇄하려면, 색인 괄호의 추가 세트를 추가하고 문자열이 아닌 문자를 인쇄하는 기능을 사용
fputc(getr[0][2],stdout); /* print 3rd char in 1st string */
printf("%c",getr[1][3]); /* print 4th char of 2nd string */
당신이이었다 연결된 모든 문자열을 얻고 있었다 이유를 때문에 널 문자에서 이전 문자열은 다음 문자 배열로 오버플로되고 읽은 다음 문자열의 첫 번째 문자로 덮어 씁니다. 마지막 문자열의 널 (null)은 메모리의 다음 (잘못된 것)에 2D 배열을 지나치게 오버플로했을 것입니다.
널 종료 문자 (즉, 4 개 문자 문자열의 경우 5 개 요소)를위한 공간을 남겨 둘 필요가 있습니다. 또한, 99 문자 문자열을위한 공간이 없을 때'% 99s '를 사용하지 마십시오. – Dmitri