2014-09-25 3 views
0

인쇄물에 약간의 어려움이 있습니다. 기본적으로 코드가 있고 에 값을 할당하고 있는데 이는 line_t 유형으로 정의됩니다 (아래 구조체 참조).getline()을 사용하면서 인쇄 문제가 발생했습니다.

보시다시피, bestmatch[].score (double), bestmatch[].index (int)bestmatch[].buf (string)에 대한 값을 저장하고 있습니다. 인쇄 할 때 아래의 두 번째 코드 블록에 bestmatch[i].indexbestmatch[i].score이 올바르게 인쇄하십시오. 그러나 bestmatch[i].buf은 전혀 인쇄하지 않습니다.

문제를 혼란스럽게하는 경우 (적어도 자신에게), scorecmp (첫 번째 코드 블록)의 끝에 bestmatch[i].buf을 인쇄하면 정상적으로 인쇄됩니다. 나는 아래쪽에있는 scorecmp에 대한 참조를 위해 전화를 받았다.

왜 색인을 인쇄하고 벌금을 부과하지만 buf가 아닌가? 아니면이 문제를 어떻게 해결할 수 있습니까?

도움 주셔서 감사합니다. 당신이 메인에 등장, 추가 정보

에게 인쇄를 필요로하는 경우 다음과 같이 알려 주시기 바랍니다 (참조, TOP_SCORING_MAX 요소의 수는 베스트 매치 []에) :

int i; 
for (i = 0; i<TOP_SCORING_MAX; i++) { 
    if (bestmatch[i].score != -1) { 
     printf("line\t%d, score = %6.3f and string is %s \n", 
      bestmatch[i].index,bestmatch[i].score, bestmatch[i].buf); 
    } 
} 

그리고 경우에

scorecmp(linePtr, bestmatch); 
+2

데이터를 초기화하는 방법을 보여 주어야하며, 'buf'포인터가 가리키는 문자열의 종류는 무엇입니까? – unwind

+0

@unwind buf는 stdin의 입력 텍스트 파일 한 줄입니다. – KittiCat

+1

@KittiCat'malloc()'을 사용하여 문자열을 저장하는 유효한 메모리 영역으로'buf '를 설정하지 않는 한, 바로 거기에 문제가 있습니다. 코스. 내가 말했듯이 더 많은 코드를 보여줍니다. – unwind

답변

1

당신이 필요합니다 : 이것은 내 전화가 scorecmp하는 것입니다

typedef struct line_t { 
    char* buf; 
    int lineLength; 
    int wordCount; 
    int index; 
    double score; 
} line_t; 

: 당신은 구조체를 싶습니다 그들이 파괴 해제, 또는 절단하는 것 때문에 당신이 그들을 인쇄하기 전에, 문자열뿐 아니라 포인터의 내용을 복사 :

bestmatch[j].buf = strdup(linePtr->buf); 

는 마지막에 복사 된 문자열을 해제하는 것을 잊지 마십시오.

+0

또는 malloc + memcpy를 사용하여 코드를 이식성있게 만들 수 있습니다. – Lundin

+0

오오 !! 나는 지금 무슨 일이 일어나고 있는지 이해하고 있다고 생각한다. 이 일을 strcpy를 사용할 수 있습니까? – KittiCat

+0

이것은 정말로'scorecmp' 함수가 호출되는 인수에 달려 있습니다. OP가 해당 정보를 지정하지 않았기 때문에 귀하의 대답은 교양있는 추측입니다 (가장 정확한 것은 맞지만 그럼에도 불구하고 추측입니다). –

0

getline 기능은 스트림에서 텍스트 줄을 읽는 데 선호되는 방법입니다.

다른 표준 기능 (예 : gets, fgetsscanf)은 약간 신뢰할 만하지 않습니다.

getline 함수는 스트림에서 다음 줄 바꿈 문자까지 전체 줄을 읽습니다. malloc 또는 calloc에 할당 된 메모리 블록에

  1. 포인터 :

    이 함수는 세 개의 매개 변수 걸린다. 이 매개 변수는 char** 유형이며 함수가 반환 될 때 getline으로 읽은 행을 포함합니다.

  2. size_t의 변수에 대한 포인터. 이 매개 변수는 첫 번째 매개 변수가 가리키는 메모리 블록의 크기 (바이트)를 지정합니다.

  3. 라인을 읽을 스트림입니다.

첫번째 파라미터 - malloc 또는 calloc에 할당 된 메모리 블록에 대한 포인터 - 단지 제안한다. 기능 getline은 필요에 따라 자동으로 realloc을 통해 메모리 블록을 확대하므로 절대 공간이 부족하지 않으므로이 기능이 안전 한 이유 중 하나입니다. 그뿐만 아니라 두 번째 매개 변수에서 반환 된 값을 업데이트하여 블록의 새 크기를 알려줍니다. 말했다되고 그건


, 마다이 기능 getline 전화, 먼저 필요성 : 적당한 크기로 설정

  • maxSz.

  • 세트 line.buf = malloc(maxSz).

사용되는 중복 메모리 양을 줄이려면 maxSz의 값을 너무 크게 설정하지 마십시오.

getline 번을 realloc 번으로 줄이려면 maxSz의 값을 너무 작게 설정하지 마십시오.

+0

부탁 드려 죄송합니다. 어떻게이 문제를 해결할 수 있습니까? 완전히 이해하지 못했습니다. 모두 – KittiCat

+0

@ KittiCat : 우선, 당신이 다루고있는 문제를 이해하고 싶다면이 대답을 시도하고 이해할 필요가 있습니다.둘째, 솔루션을 원한다면 답의 맨 아래에있는 답이 나에게 주어집니다. 다시 말하지만, 문제를 이해하려고 시도하는 것이 좋습니다 (위의 대답을 읽음). –

+0

@KittiCat : 질문의 제목을 "함수 getline 문제"또는 이와 비슷한 것으로 변경하는 것이 좋습니다. 문제가있는 곳이기 때문입니다. 그렇게하면 질문에 대한 몇 가지 답변을 얻을 수 있습니다 (따라서 이해하기가 더 쉬워 질 수 있음). –

관련 문제