2017-01-06 2 views
-4

C 코드에 문제가 있습니다. 입력 버튼으로 구분 된 이름 목록을 입력해야합니다. 사용자가 "QUIT"단어를 입력하면 입력이 중지됩니다. 프로그램은 이름 목록을 알파벳순으로 인쇄해야합니다 (모든 문자는 소문자입니다).포인터 배열의 동적 할당

각 이름의 수와 길이는 알 수 없으므로 동적으로 할당해야합니다. 또한 이름이 입력에 두 번 이상 나타나면 출력에 한 번만 나타납니다. 나는 각 포인터가 각각 포함하는 포인터의 동적 할당 배열을 사용하는 방법에 대한 생각

ben 

chris 

david 

john 

:

Please enter a list of names: 

john 

chris 

ben 

chris 

david 

QUIT 

4 개 이름이 있습니다 : 여기

코드를 실행하는 방법에 대한 예제 이름이며 동적으로 할당됩니다. 문제는 런타임 오류가 발생하지 않고이를 작성하는 방법을 모른다는 것입니다.

참고 :이 시점에서, 아직 배우지 못한 것들을 구조체 및 재귀처럼 사용할 수 없으며 stdio.h, stdlib.h 및 string.h 라이브러리 만 사용할 수 있습니다.

미리 감사드립니다. 여기

이 (가 완료 아니지만, 나는이 시점에서 런타임 오류를 받고 있어요) 코드입니다 :

char **nameList; 
int i = 0, j = 0, size = 0, check = 0; 
printf("Please enter list of names:\n"); 
//allocate one cell of memory to the list 
nameList = (char**)malloc(sizeof(char)); 
if (nameList == NULL) 
{ 
    printf("Cannot allocate Memory"); 
    return 0; 
} 
//Add the first letter to the first string in the array 
nameList[i][j] = getchar(); 
size += sizeof(char); 
while (check != 1) 
{ 
    //check if current entered letter is not an enter 
    while (nameList[i][j] != '\n') 
    { 
     //allocated another char sized memory to the string 
     nameList = (char**)realloc(nameList, (size + sizeof(char))); 
     if (nameList == NULL) 
     { 
      printf("Cannot allocate Memory"); 
      return 0; 
     } 
     j++; 
     //adding another char to the current string 
     nameList[i][j] = getchar(); 
     size += sizeof(char); 
    } 
    j = 0; 
    if (nameList[i][j] == 'Q') 
    { 
     if (nameList[i][j + 1] == 'U') 
      if (nameList[i][j + 2] == 'I') 
       if (nameList[i][j + 3] == 'T') 
        check++; 
    } 
    i++; 
} 
+1

[ask]와 [mcve]를 읽으십시오. 당신은 런타임 오류를 언급하고, 그 원인은 무엇입니까? 우리는 수정하려고 시도한 특정 문제를 도울 수 있지만 Stack Overflow는 코드 작성 서비스가 아닙니다. – whrrgarbl

+0

좋습니다, 당신은 포인터와 문자열의 배열을 동적으로 할당 할 수 있어야합니다. 따라서 현재 코드와 오류를 표시해야합니다. –

+0

나는이 학생의 학습 기회를 빼앗아 버리는 대답에 투표 할 것입니다. –

답변

0

이름 목록 = (문자 **) realloc을 (이름 목록 (크기 +를 sizeof (숯)));

음 ... 왜 거기에 '+'를 사용하고 있습니까? 그리고 당신은 잘못된 종류의 가치의 크기를 찾고 있습니다.

포인터의 배열을 할당합니다. 그러나 여기서 가리키는 포인터는 무엇입니까?

+0

문자열이 '끝내기'가 아닌 한 문자를 입력 할 때마다 문자의 크기에 다른 메모리를 추가하려고하기 때문에 '+'를 사용하고 있습니다. 가장 큰 문제는 올바른 방법인지, 그리고 배열 목록과 각 문자열에 대해 realloc을 사용해야하는지 여부를 모른다는 것입니다. 각 포인터는 입력 한 각 문자열을 가리키고 입력이 입력되면 각 문자열이 구분됩니다. – Evi

+0

문자열을 별도로 할당해야합니다. – luckykaa

+0

배열의 각 항목은 문자열에 대한 포인터입니다. 따라서 nameList [0]은 문자열에 대한 포인터이며 그 문자열을 할당해야합니다. namelist [1]은 nameList [2]와 nameList [i]의 다음 문자열에 대한 포인터입니다. 초보자에게는 포인터에 대한 포인터를 추적하는 것이 매우 어려울 수 있으므로 다음 단계의 조언을 통해 혼란 스러울 수 있습니다. 그러나 당신은 여전히 ​​여기에서 문제를 발견 할 것입니다. nameList는 "char *"(char에 대한 포인터) 목록이며 "char"가 아닌 경우 sizeof (char *)를 사용해야합니다. – luckykaa

관련 문제