2017-11-02 7 views
1

: 나는이 프로그램이 단지 위치 "tnome[0][0]"를 저장하는 코드를 실행하면매트릭스 하나 개 이상의 값 코드입니다

int qtd_alunos, qtd_temas; 
char* tnome[1][10]; 
char* anome[1][10]; 

printf("\nPra distribuir os temas me diga quantos alunos vao participar e aperte enter, depois a quantidade de temas."); 
scanf("%d%d", &qtd_alunos, &qtd_temas); 
printf("Agora vai escrevendo o nome de cada tema\n"); 

for(int j = 0; j<qtd_temas; j++){ 
    printf("Tema %d\n", j+1); 
    scanf("%s", tnome[0][j]); 
    printf("%s ok!\n",tnome[0][j]); } 
return 0; } 

하지만 때 프로그램이 종료 [0][1]"int j" 변경됩니다. 나는 그것이 왜 일어나는 지 이해할 필요가있다.

+0

(https://stackoverflow.com/questions/2614249/을 형식 문자열에 scanf에 의해 판독 된 문자열 의 크기를 제한 할 수 있습니다 동적 메모리를위한 2 차원 문자 배열)에 대한 해답은 [this] (https://stackoverflow.com/questions/18083984/how-to-store-and-then-print-a-2d-character)입니다. -string-array) 대답으로 충분할 것입니다. – Yahya

+0

이 질문과 같이 런타임 문제를 묻는다면'scanf()'함수 군을 호출 할 때 [mcve] – user3629249

+0

을 게시하십시오 : 1) 항상 매개 변수 값이 아닌 반환 값을 확인하여 확신하십시오 수술은 성공적이었다. 2) '% s'또는 '% [...]'입력 변환 지정자를 사용할 때 항상 입력 필드의 길이보다 하나 작은 MAX CHARACTERS 수정자를 포함하십시오. 왜냐하면'scanf()'는 항상 그 지정자에 NUL 바이트를 추가하기 때문입니다. – user3629249

답변

1

scanf에 초기화되지 않은 포인터에 문자열을 저장하도록 요청하고 있습니다. 그것은 아무데도 가리 키지 않습니다. 이 문제를 해결하려면 문자열에 수동으로 메모리를 할당 한 다음 포인터를 설정해야합니다. 예를 들어 : 첫 번째 차원이 2 차원 배열을 쉽게 1D로 감소 될 수있는 크기 1의 경우

#define MAX_LEN 101 

char *names[10]; 

for (int i = 0; i < 10; i++) 
    names[i] = malloc(sizeof(char) * MAX_LEN); 

난 당신이 다차원 배열을 사용하는 이유를 모르겠어요. 당신이 다음 대신 를 사용 (문자의 2D) 문자열의 1 차원 배열로 사용하는 것을 의미하는 경우 는 :

char names[10][MAX_LEN]; 

을 여기에 첫 번째 차원은 문자열의 양이고 두 번째는 그들의 크기입니다. 그리고 자동으로 할당되기 때문에 직접 할 필요가 없습니다.

두 가지 중요한 발언 :

  • 는 컴파일러 경고를 활성화합니다.
  • 버퍼 오버 플로우에주의 : 당신은 [여기] (즉 "%100s")
+0

MAX_LEN을 제거하고 다음으로 변경했습니다 : tnome [j] = malloc (sizeof (char)); 이제는 잘 작동하고 있으며, 일차원 배열을 사용하고 있습니다. –

+0

@ ThhiagoBarboza 당신은 단일 문자에 대한 공간을 malloc했습니다. 예'MAX_LEN'는 단지 문자열의 크기입니다. 귀하의 필요에 맞는 것을 사용하십시오. – sidyll

+1

알겠습니다. 콘솔에 더 큰 단어를 쓸 필요가있을 때 프로그램에서 오류를 반환 할 수 있습니다. 팁 고마워. –

1

문자열을 읽기 전에 공간을 할당해야합니다!

예를 들어 입력을 읽기 직전에 malloc()을 사용하거나 2D 대신 3D 배열을 선언하십시오.