2011-09-20 2 views
4

printf를 사용하여 이해할 수없는 문제가 있습니다. 이 문제가 생길 때가 처음인데, 그것은 순진한 것이지만 무엇이든지, 스스로 해결할 수는 없을 것입니다 ... 아마도 그것은 피곤하기 때문일 것입니다 : fprintf (그리고 나는 발견했습니다. 올바르게)의 printf에 대해서도 사실 문자열Printf 및 fprintf는 첫 번째 인수 만 인쇄합니다.

여기에 관련 코드의 내용은 "()는 null를"그것은 단지 "0"번호를 인쇄 할 두 번째에서 첫 번째 인수를 인쇄합니다

#include <math.h> 
#include <stdbool.h> 
#include <stdint.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

void printInputStream(MatePair* inputStream, char* leftFile, char* rightFile){ 

    MatePair* iterator = inputStream; 
    FILE* outLeft = fopen(leftFile, "w"); 
    FILE* outRight = fopen(rightFile, "w"); 


    while (iterator->leftRow != MATEPAIR_STOP){ 

     fprintf(outLeft, "%d: \n", iterator->leftRow); 
     fprintf(outLeft, "%s \n", iterator->leftDNA); 
     fprintf(outLeft, "%d: %s \n", iterator->leftRow, iterator->leftDNA); 

     iterator++; 
    } 

    fclose(outLeft); 
    fclose(outRight); 

} 

가 여기에 출력의 시작 :

48: 
NAATAGACCTATATCCTGTACCCAAACAGAAGACAGAGGATTAACCAAACTCTT 
48: (null) 
44: 
NTAGCCATCTTAGACACATGAATATCTTGGGTCACAACTCATACCTCAACAAAA 
44: (null) 
40: 
NAAAATAAGGGGTATACTCGCTTCGGGGCCCCATTTGGCCTCCAAAAGGGGGCG 
40: (null) 
36: 
NTCTATCTTGCTCGAGAGAAAGGGTTGCCTTAGGGTTTTTTGGGGGGGGCTGTA 
36: (null) 
32: 
NCTATAGAAATTTCCCATACCAACTAGACATTTATCTTCCTGTTTTTTTCCGCC 
32: (null) 

위와 같이 배열 tw의 모든 멤버를 출력합니다. 얼음 : 한 번 인수 당 두 번 논쟁. 데이터는 괜찮습니다. 실제로 첫 번째 방법은 모두 괜찮습니다. 두 번째 방법은 첫 번째 인수 만 인쇄합니다. 아이디어가 있으십니까? 미리 감사드립니다.

+1

컴파일시 모든 경고 (-gcc의 경우)를 켜고'fprintf's에 대한 경고가 표시되는지 확인하십시오. 'iterator-> leftRow'는'int'가 아닌 다른 타입의 것입니다. – Shahbaz

+1

'int'와'char *'를'fprintf()'에 넘기는 테스트 케이스를 작성했다면 완벽하게 작동합니다. 이것은 귀하의 데이터가 문제임을 지적합니다. @pmg는 아래 답변에서 가장 정확합니다. 유형이 잘못되었지만 이와 같은 문제에 접근 할 때 사용해야 할 생각을 설명하고 싶었습니다. –

+0

미래의 독자를 위해 int64_t에 대한 올바른 printf 형식은 % I64d입니다. 아니면 적어도 저에게는 효과적입니다. 모두가 고마움을 표하는 것은 매우 순진한 실수라고 생각했습니다. 문제는 대개 컴파일러에서 이러한 오류에 대한 경고를 받지만이 경우는 약간 다르다는 것입니다. 지금부터 -Wall -Wextra 및 -pedantic을 사용하는 것이 더 좋습니다. – Alex

답변

8

다음 줄과 캐스트가 "작동"합니까?

fprintf(outLeft, "%d: %s \n", (int)iterator->leftRow, iterator->leftDNA); 

나는 iterator->leftRow하지int 유형 (또는 자동적으로 int로 변환됩니다 몇 가지 작은 타입)입니다 생각한다. 내가 맞으면 Undefined Behaviour을 호출합니다. 첫 번째 경우 (별도의 문장)에는 명백한 "잘못된 행동"(불운)이없고, 두 번째 경우에는 "잘못된 행동"은 "(NULL)"을 인쇄하는 것입니다.

+1

네, 맞습니다! 정말 바보 같은 ... leftRow는 int64_t입니다. (long long int의 크기가 컴파일러에 따라 다르면 64 비트 길이로하고 싶습니다.) printf의 올바른 형식 유형은 무엇입니까? 나는 길고 오랫동안 만 찾았지 만 괜찮은지 모르겠다. – Alex

+0

좋아, 나는 그것을 발견했다. 나는 % l64d (소문자 L, 틀린)를 위해 % I64d (대문자 i, 맞음)를 착각했습니다. 그래서 그것을 찾을 수 없었습니다. 대답에 다시 한번 감사드립니다. – Alex

+2

'printf ("%"PRId64 ": % s \ n", v64, "string"과 같이'int64_t' 타입의 C99 표준 printf 지정자는'PRId64'입니다 ('#include ' "); 나는 마이크로 소프트의 컴파일러가 C99을 따르지 않는다고 믿는다. 그래서 당신은 자신의 unportable way (''% I64d '')를 사용하거나''long'으로 캐스팅하고''% ld "'을 사용하여 미래가 아무 것도 깨지 않기를 희망한다. – pmg

2

어떤 데이터 유형에는 iterator-> leftRow가 있습니까? 해보려고 했습니까 (예 : 긴 것으로 가정).

fprintf(outLeft, "%ld: %s \n", iterator->leftRow, iterator->leftDNA); 
관련 문제