c++ - 형식 지정 IO 함수에서 변환 지정자 % i와 % d의 차이점은 무엇입니까 (* printf / * scanf)


printf 에서 형식 지정자로 사용될 때 %d%i 의 차이점은 무엇입니까?



Answers



printf 사용하여 출력 할 때와 동일합니다.

그러나 이들은 입력 지정자와 같이 사용하는 경우와 다릅니다. 예를 들어 scanf 에서 %d 는 부호가있는 십진수로 정수를 스캔하지만 %i 은 10 진수로 기본값이 지정되며 16 진수 ( 0x 가 앞에 오는 경우)와 8 진수가 0 경우 8 진수도 허용합니다.

그래서 033%i 와 함께 27이 될 것이지만 %d 33이 될 것입니다.




이것은 printf 와 동일하지만 scanf 와는 다릅니다. printf 경우 %d%i 는 부호가있는 10 진 정수를 지정합니다. scanf 경우 %d%i 는 부호있는 정수를 의미하지만 %i 은 앞에 0x 있으면 입력을 16 진수로, 앞에 0 있으면 8 진수로 inteprets합니다. 그렇지 않으면 입력을 10 진수로 해석합니다.




printf%i%d 형식 지정자 간에는 차이점이 없습니다. C99 표준 초안 7.19.6.1 형식 지정자와 관련하여 printf 를 다루는 fprintf 함수8 단락에서 설명합니다.

변환 지정자와 그 의미는 다음과 같습니다.

다음 글 머리 기호를 포함합니다.

d,i     The int argument is converted to signed decimal in the style
        [−]dddd. The precision specifies the minimum number of digits to
        appear; if the value being converted can be represented in fewer
        digits, it is expanded with leading zeros. The default precision is
        1. The result of converting a zero value with a precision of zero is
        no characters.

반면에 scanf 경우 %d 는 기본 10을 가정하고 %i 는 기본을 자동으로 감지합니다. 우리는 7.19.6.2 가서 이것을 볼 수 있습니다. 단락 12 에서 7.19.6.2 와 관련하여 scanf 를 다루는 fscanf 함수 는 다음과 같이 말합니다 :

변환 지정자와 그 의미는 다음과 같습니다.

다음을 포함합니다 :

d     Matches an optionally signed decimal integer, whose format is the
      same as expected for the subject sequence of the strtol function with
      the value 10 for the base argument. The corresponding argument shall
      be a pointer to signed integer.

i     Matches an optionally signed integer, whose format is the same as
      expected for the subject sequence of the strtol function with the
      value 0 for the base argument. The corresponding argument shall be a
      pointer to signed integer.



그 두 단어는 동의어입니다.