2017-12-14 25 views
1

다음 코드를 고려하십시오 :printf 문자 (% c, % d)를 함수 인수로 전달하는 방법이 있습니까?

#include <stdio.h> 

void printStrGeneric(void *, int, int); 
void printNumGeneric(void *, int, int); 

int main() 
{ 

    int intArray[] = { 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85 }; 

    printNumGeneric(intArray, sizeof(intArray), sizeof(int)); 
    printStrGeneric(intArray, sizeof(intArray), sizeof(int)); 
    puts(""); 

    short shortArray[] = { 65, 66, 67, 68, 69, 70, 71, 72, 73, 74 }; 

    printNumGeneric(shortArray, sizeof(shortArray), sizeof(short)); 
    printStrGeneric(shortArray, sizeof(shortArray), sizeof(short)); 
    puts(""); 

    return 0; 
} 

void printStrGeneric(void *object, int size, int elem_size) 
{ 
    char *p = (char *) object; 
    while (p < (char *) object + size) { 
     printf("%c\t", *p); 
     p += elem_size; 
    } 
    puts(""); 
} 

void printNumGeneric(void *object, int size, int elem_size) 
{ 
    char *p = (char *) object; 
    while (p < (char *) object + size) { 
     printf("%d\t", *p); 
     p += elem_size; 
    } 
    puts(""); 
} 

- 기능 printStrGenericprintNumGeneric합니다 (printf 편지를 제외하고) 거의 동일 주어진을, 나는 그것을 대신 한 기능을 가지고 어떤 방식으로 수 있는지 궁금해 함수에 인수로 printf 문자 (%c 또는 %d)를 전달합니까?

+4

예. 형식 지정자는 문자열입니다. 함수에 매개 변수로 전달하십시오. – OldProgrammer

+1

형식 문자열에 문자열 리터럴을 사용하면 [보안 취약성] (https://en.wikipedia.org/wiki/Uncontrolled_format_string)이 열릴 수 있기 때문에 가능하지만 권장하지는 않습니다.). – 0x5453

+3

인자가 프로그래머로부터 나오는 한, 나는 printf보다 보안상의 구멍이 더 이상 없다는 것을 알지 못한다. printf의 실제 보안 문제는 사용자가 획득 한 문자열을 형식 문자열로 전달한 경우입니다. – SoronelHaetir

답변

2

읽기의 사용에 대해 :

  1. va_args

  2. 의 구문은 다음과 같습니다 형식, ...

이 둘을 조합하면 함수에 형식을 전달하고 원하는대로 처리 할 수 ​​있습니다.

매우 간단한 설명입니다. https://www.eskimo.com/~scs/cclass/int/sx11b.html

+1

이것은 두 가지 형식을 간단히 선택하기에 과도 함이며 초보자에게는 특히 취약성을 피하기 위해 상당한 노력이 필요합니다. [Saravana Kumar]의 [answer] (https://stackoverflow.com/a/47822866/298225) (https://stackoverflow.com/users/6162823/saravana-kumar)는보다 적합한 즉각적인 해결책입니다. 또한 실제 솔루션을 제공하지는 않으며 해결책을 찾기 위해 연구 할 정보에 대한 참조 만 제공합니다. –

+0

실제로 문제를 해결하지 못하는 것 같습니다. – Gerhardh

2

인수로 형식 지정자를 전달하는 것은 @OldProgrammer와 같이 수행하는 한 가지 방법이지만 @ 0x5453처럼 지적하는 것이 취약점 일 수 있습니다.

bool 값을 추가 매개 변수로 전달하고 if 조건을 사용하여 printf 함수를 제어하지 않습니까? 그래서 코드는 다음과 같습니다

void printGeneric(void *object, int size, int elem_size, bool str) 
{ 
    char *p = (char *) object; 
    if(str){ 
     while (p < (char *) object + size) { 
      printf("%c\t", *p); 
      p += elem_size; 
     } 
    }else{ 
     while (p < (char *) object + size) { 
      printf("%d\t", *p); 
      p += elem_size; 
     } 
    } 
    puts(""); 
} 
+0

다음과 같이 간단히 할 수 있습니다 :'char * fmt = str? "% c \ t": "% d \ t";'그런 다음이 포인터를'printf'에서 사용하고'if'를 드롭하십시오. – Gerhardh