2014-07-07 6 views
0

아래에 표시된 함수가 호출되면 문자열의 특정 부분을 텍스트 파일에 씁니다. 그것은 때때로 문자를 제거 할 것이므로 낙뢰 번호는 "ghtning strik number"로 나옵니다. 스트라이크 번호를 캐릭터로 올바르게 표시 한 적이 없으며 항상 "번개 수 :"로 표시됩니다. 나는 문제가 strcat와 있을지도 모른다라고 생각한다. 그러나 나는 정확하게 도움이 될 것 인 이유를 정확하게 이해할 수 없다.fwrite와 strcat는 문자열을 자르고 넌센스 값을 쓰는 것

void recordLightningStrike(int strikeNumber, char fileName[], FILE *filePointer) 
{ 
    time_t systemTime; 
    struct tm *UTCTime; 

    char numberOfStrikes[6]; 
    char strikeTime[24]; 
    char stringOne[25]; 
    char stringTwo[55]; 
    //char finalString[200]; 

    itoa(strikeNumber, numberOfStrikes, 10); 
    time(&systemTime); 
    UTCTime = localtime(&systemTime); 
    strcpy(strikeTime, asctime(UTCTime)); 
    strcpy(stringOne, "Lightning Strike Number: "); 
    strcpy(stringTwo, "Lightning Strike Occurred at: "); 
    strcat(stringOne, numberOfStrikes); 
    strcat(stringTwo, strikeTime); 
    //strcpy(finalString, stringOne); 
    //strcat(finalString, stringTwo); 
    printf(" %s %c ", stringOne, '\n'); 
    FILE *openPointer = fopen(fileName, "a"); 
    if(openPointer!=NULL) 
    { 
     fwrite(stringOne, sizeof(char), sizeof(stringOne), openPointer); 
     fwrite(stringTwo, sizeof(char), sizeof(stringTwo), openPointer); 
    } 
    fclose(openPointer); 
} 

답변

0

두 버퍼 (stringOne 및 stringTwo)를 더 크게 선언하십시오. sizeof() 대신 strlen을 사용하십시오. 또한, 성능을 위해, (실제로 버퍼 크기를 계산하고 1 버퍼를 작성) 인수 sizecount를 교환하여 한 번에 각 버퍼 쓰기 :

. 
. 
. 
char stringOne[50]; // guess; you could compute it more tightly 
char stringTwo[60]; // guess; you could compute it more tightly 
. 
. 
. 
fwrite(stringOne, sizeof(char) * strlen(stringOne), 1, openPointer); 
fwrite(stringTwo, sizeof(char) * strlen(stringTwo), 1, openPointer); 
. 
. 
. 

위의 조정이 아마 당신의 프로그램을 수정합니다. 하지만 당신은 FILE*에 직접 인쇄, 더 나은, fprintf()을 버퍼에 인쇄하거나 snprintf()를 사용하여 쉽게 읽을 수 있도록 수 :

fprintf(openPointer, "Lightning Strike Number: %d\n", strikeNumber); 
fprintf(openPointer, "Lightning Strike Occurred at: %s\n", asctime(UTCTime)); 
+0

나 strlen 고정 정크 사용에 대한 귀하의 제안에도, 그러나, 문제를 값 나는 stringOne의 크기를 60으로 늘려 여전히 파업의 횟수를 늘 렸습니다. 그러나 fprintf를 사용하여 문제를 해결했습니다. 감사합니다. fwrite가 작동하지 않는 이유에 대한 통찰력이 있다면 그 점이 인정 될 것입니다. – user1505399

0

당신의 문자 배열의 크기를 조정하지 않습니다 strcat와, 그래서 라인

strcat(stringOne, numberOfStrikes); 

배열을 오버 플로우 숫자는 저장되지 않습니다. stringOne의 크기를 몇 슬롯 늘리십시오.

0

stringOne에는 충분한 공간이 없습니다. 문자 ("Lightning Strike Number: ")에 복사 한 초기 문자열은 이미 0 문자 종료 문자를 포함하여 문자열이 26 자이기 때문에 25 문자의 버퍼를 오버플로합니다. 그럼 너 더 strcat. 문자열 크기를 너무 작게 만들지 마십시오.