카테고리 없음

아두이노와 가변인자 #4

오징어땅콩2 2020. 9. 29. 14:09
반응형

마지막으로 sprintf를 대체할만한 xprintf를 만들어 보자.

sprintf만 가지고도 충분히 좋기는 하지만, 한가지 부족한 실수 문제를 극복하자.

별다른 이유는 없다. 가변인자에 대한 설명이다.

 

가변인자를 바로 활용하기는 어렵겠지만, 

기본개념만 알고가는것도, 이런것이 있다는것도 재미있는 코딩 생활이 될것이다.

 

 
#include <stdarg.h>
#include <string.h>
 
void xprintf(char* p, char *types, ...)    
{
    va_list ap;   
    int i = 0;
    va_start(ap, types);        
    while (types[i] != '\0')   
    {
      if(types[i]=='%')
      {
          i++;
          switch (types[i])       
          {
            case 'i':                            
            p += sprintf(p, "%d", va_arg(ap, int));      
            break;
            case 'd':                               
            p += sprintf(p, "%s", String(va_arg(ap, double),2).c_str());   
            break;
            case 'c':                              
            p += sprintf(p, "%c", va_arg(ap, int));     
            break;
            case 's':                               
            p += sprintf(p, "%s", va_arg(ap, char *));   
            break;
            default:
            break;
          }
      }
      else
      {
       p += sprintf(p, "%c", types[i]);     // char 크기만큼 값을 가져옴
      }   
        i++;
    }
    va_end(ap);    // 가변 인자 포인터를 NULL로 초기화
}
 
void setup() 
{
  Serial.begin(9600);
}
 
void loop() 
{
    char buf[30];
 
    xprintf(buf, "xxxx%c temp=%i %s %d"'d'1"ASSSSS"12.56);             
    Serial.println(buf);
    delay(1000);
}