2014-11-21 2 views
1

다차원 배열에 저장하려는 4 개의 scanf-string 입력이 있습니다. 문자열을 올바르게 저장했는지 모르겠지만 전체 배열이나 특정 문자를 단순히 인쇄 할 수는 없습니다.다차원 배열에 문자 저장 관련 문제

char getr[4][4]; 

    for (z=0; z<4; z++){ 
    scanf(" %99s", &getr[z]); 
    } 

    for (s=0; s<4; s++) { 
     printf("%s\n",getr[s]); 
    } 

입력 : ABCD EFGH IJKL MNOP

출력 : 난 그냥 두 번째 행 또는 네 번째 문자를 인쇄하고 싶은 경우 ijklmnop MNOP

efghijklmnop abcdefghijklmnop 첫 번째 줄? 아무도 몰라? 다음과 같은

+0

널 종료 문자 (즉, 4 개 문자 문자열의 경우 5 개 요소)를위한 공간을 남겨 둘 필요가 있습니다. 또한, 99 문자 문자열을위한 공간이 없을 때'% 99s '를 사용하지 마십시오. – Dmitri

답변

0

먼저 변화 :

printf("%c\n", getr[0][3]); // %c is used here because just print one character. 
0

다음과

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 배열을 지나치게 오버플로했을 것입니다.