2013-04-25 2 views
-1

다음 두 가지 경우에서 출력을 이해할 수 없습니다. 컴파일러 : 볼랜드 C++ 5.02 창에 CASE 1 :다음과 같은 경우 printf 문에서 % 기호의 역할

#include <stdio.h> 

int main() 
{ 
    char str[] = "HELLO"; 
    printf("abc %2s", str, str); //% sign removed 
    return 0; 
} 
output:abc 1310540 

는 어린애 종류 C에서의 순진 나는 소리를하면 나를 outputs.Pardon을 이해하시기 바랍니다 : 2

#include <stdio.h> 

int main() 
{ 
    char str[] = "HELLO"; 
    printf("%abc %2s", str, str); 
    return 0; 
} 
output:%abc %2s 

CASE

+1

그리고 정확한 질문은 무엇입니까? –

+0

두 버전을 각각 무엇을 기대합니까? – NPE

+0

출력을 이해할 수 있습니까? –

답변

3

여기에 내 생각이다. 따라서 런타임은 인식하지 못하고 포맷을 포기하는 포맷 문자열을 발견했습니다. 어쨌든 문자열을 %a에 전달할 수 없으며 의미있는 것이 필요합니다. 따라서 컴파일러가 '% a'를 이해하더라도 그 동작은 정의되지 않습니다. UB를 이해하려고 시도 할 때 얻게되는 것이 거의 없습니다. 코드를 수정하십시오.

printf("abc %2s", str, str); 

해야 심지어 고대의 컴파일러에 출력

abc HELLO 

. 그렇지 않으면 컴파일러 런타임의 버그입니다.

저는 개인적으로 컴파일러가 해당 프로그램의 출력물을 생성 할 것이라는 사실을 알았습니다. 오히려 귀하의 질문이 잘못 표기되었다고 생각합니다. 질문의 출력이 코드와 일치하지 않거나 반대의 경우도 마찬가지입니다.

그리고 그것은 당신의 페이스트 빈에 의해 확인 것 :

#include<stdio.h> 

int main() 
{ 
    char str[] = "HELLO"; 
    printf("abc %d", str, str);//different from code in question 

    return 0; 
} 

Output: abc -1083086374 

그래서,뿐만 아니라 그것을 UB을 논의 조금 무의미, 그것은 훨씬 더 무의미 버전 당신이 문제의 코드에서 다릅니다 실행중인 프로그램을 논의이다 . 미래에는 스택 오버플로 질문으로 코드를 전송하기 위해 복사/붙여 넣기를 사용하고, 출력은 자신이 주장하는 것임을 두 배와 세 번 확인하는 것이 좋습니다.

결론 : 2013 년입니다.BCC v5.02를 사용할 이유가 없습니다. 이제는 앞으로 나아갈 때입니다.

+0

출력보기 http://codepad.org/oyemZi21#output –

+0

이 예제에서는'% d'을 사용하여 문자열 이외의 문자열을 표시합니다. 정확하게 문자열을 값으로 전달할 때'% a'에 대해 위에서 설명한 것처럼 정의되지 않습니다. 컴파일러/런타임은 핵 미사일 발사, 하드 디스크 닦기 또는 전달한 문자열 인쇄 등을 포함하여 원하는 모든 작업을 수행 할 수 있습니다. 대부분의 경우 세 가지 예제 중 하나도 수행하지 않지만 " 무작위 "번호. 나는 "그것이 무엇인지 알아내는 것이 완전히 불가능"하거나 "매번 다른"것과 같이 무작위를 의미하지는 않지만, "나는 말할 수 없습니다 ..." –

+0

@Aakash 답변을 업데이트했습니다. 질문에 오류가 있습니다. –

0

첫 번째 문자는 인쇄 할 문자열을 16 진수 부동 소수점으로 넣으려고하므로 정의되지 않은 동작입니다.

두 번째 예가 유효합니다. 최소 2 자의 문자열을 인쇄합니다. 두 번째 인수 str은 무시됩니다.

+0

"HELLO"는 어떻게 "1310540"이됩니까? –

+0

@DavidHeffernan 그렇지 않습니다. –

+0

당신은 그 코멘트에 대해 자세히 설명 할 예정입니까? 나는 당신이 의미하는 것을 이해할 수 없다. –

0

full POSIX documentation for printf (Linux 콘솔에서 man 3p printf을 입력 할 수도 있음) 또는 컴파일러/C 표준 라이브러리 구현 설명서를 읽어야한다고 말할 수 있습니다.

기본적으로 % 문자 다음에 나오는 문자는 매우 구체적인 방식으로 해석됩니다. % 다음의 문자는 "플래그", "길이 변경자"및 "변환 지정"범주에 속하며 각 요소는 변환 지정자를 제외하고 선택 사항입니다. 두 번째 예제는 변환 지정자보다 많은 값을 갖고 있기 때문에 경고를 주었고 숫자 변환 플래그 ("2")를 문자열 변환 지정자와 함께 사용할 수 없기 때문에 버그가있는 것처럼 보였습니다. 그리고 그것은 말도 안되는 소리를 냈습니다 (아마도 10 진수의 포인터). %a 형식 문자열의

printf("%abc %2s", str, str); 

귀하의 고대 컴파일러 사전 날짜 소개 :

관련 문제