2017-09-18 12 views
4

:가능한이의 printf 형식입니다 (왼쪽 정당화 기호 제로에 흔적) 나는 다음과 같은 프로그램 출력을 얻을 수의 printf를 사용하려고 해요

- 20 
- 15 
- 10 
- 5 
    0 
+ 5 
+ 10 
+ 15 
+ 20 

을 주요 사양은 다음과 같습니다

  • 필드 폭은 항상 부호는 항상 왼쪽 정렬됩니다
  • 수 4
  • 항상 오른쪽 정당화이다
  • 제로 흔적

은 지금까지 나는 나에게 원하는 결과를 줄 것이다의 printf 문으로 올 수 없었다되지 않은했다. 내가 가진 가장 가까운입니다

for(int i = -20; i <= 20; i+=5) 
{ 
    printf("%-+4d \n", i); 
} 

생산하는 : 어떤 성가신 문자열 조작을 할 필요없이이 작업을 수행 할 수있는 방법이

-20                                
-15                                
-10                                
-5                                
+0                                
+5                                
+10                                
+15                                
+20                                

있습니까?

+0

출력 ... + 999 -999] i'이 범위를 벗어난 경우 '되어야 하는가? 아니면 "상관 없어?" – chux

+1

이 애플리케이션에서 'i'는 [-20, 20] 범위에만 있습니다. 그러나이 질문을 볼 수있는 다른 사람들에게 유효한 유효 범위 인 'i'를 지적하는 것은 유효한 대답에 중요합니다. – Sawyer

답변

6
printf("%c%3d\n", i>0 ? '+' : i<0 ? '-' : ' ', abs(i)); 

참고 위의 INT_MIN 실패,하지만 당신의 가치 만 크기가 1000 이하로 예상되기 때문에 그 문제가되지 않을 것이다.

+0

무당 벌레가 1 분이면 한 줄로 나옵니다. +1 – Tyler

+0

@Tyler 글쎄, 당신의 대답 때문에 발견 한 버그가있었습니다. (나는 '0'이 '+ 0'이라고 생각했다.) – ikegami

+0

나는 너를 움직이지 않았다. – Tyler

0
for(int i = -20; i <=20; i+=5){ 
    if(i==0){ 
     printf("%4d\n", i); 
    } 
    else{ 
     (i > 0)?printf("+%3d\n", i):printf("-%3d\n", -i); 

    } 

} 

미운하지만

0
for(int i = -20; i <= 20; i+=5) { 
    if(i < 0) 
     printf("-%3d \n", -i); 
    else if(i == 0) 
     printf(" 0 \n"); 
    else 
     printf("+%3d \n", i); 
} 
+0

불필요한 검사를 피하려면'else'를 사용해야합니다. ///'abs (i)'는'-i'로 단순화 될 수 있습니다. ///'printf ("% 3d \ n", i);''printf ("0 \ n");' – ikegami

3

별로 다른 사람과는 다른, 아직 "- +" 문자열에 좋은 룩업와 간단한 1 라이너를 사용할 수 있습니다. 외부 값을 처리하는

printf("%c%3d\n", "- +"[i >= 0 + i > 0], abs(i)); 

[-999 ... + 999]의 범위, 특히 -i정의되지 않은 동작되는 성가신 i = INT_MIN이 코드가 사용할 수있다 :

printf("%c%3u\n", "- +"[i >= 0 + i > 0], (i < 0) ? 0u - i: 0u + i); 
// or 
printf("%c%3lld\n", "- +"[i >= 0 + i > 0], llabs(i)); 

페 틱어 풀 레인지 솔루션의 경우

출력 예

- 20 
    0 
+ 20 
+2147483647 
-2147483648