如何使用sprintf简化语句?

时间:2015-09-01 04:27:29

标签: c pic mplab

是否可以使用sprintf简化此声明?

 unsigned char text[50];
 void decode (unsigned char* msg)
 {
     // ON LED
     if (strstr (msg, "DO1=1") == msg)
     {
         LATGbits.LATG1 =1 ; //led1 on
         sprintf(text,"OK"); // Send the result in HyperTerminal
         sendString(text) ;
     }
     else if (strstr (msg, "DO2=1") == msg)
     {
         LATGbits.LATG0 = 0 ; //LED 2 on
         sprintf(text,"OK"); // Send the result in HyperTerminal
         sendString(text) ;
     }
     else if (strstr (msg, "DO3=1") == msg)
     {
         LATGbits.LATG13   = 0 ; //LED 3 on
         sprintf(text,"OK"); // Send the result in HyperTerminal
         sendString(text) ;
     }
     else if (strstr (msg, "DO4=1") == msg)
     {
         LATGbits.LATG14   = 0 ; //LED 4 on
         sprintf(text,"OK"); // Send the result in HyperTerminal
         sendString(text) ;
     }
     else if (strstr (msg, "DO5=1") == msg)
     {
         LATGbits.LATG12   = 0 ; //LED 5 on
         sprintf(text,"OK"); // Send the result in HyperTerminal
         sendString(text) ;
     }

     // OFF LED
     else if (strstr (msg, "DO1=0") == msg)
     {
         LATGbits.LATG1 =0 ; //LED 1 off
     }
          else if (strstr (msg, "DO2=0") == msg)
     {
         LATGbits.LATG0    = 1 ; //LED 2 off
     }
          else if (strstr (msg, "DO3=0") == msg)
     {
         LATGbits.LATG13   = 1 ; //LED 3 off
     }
          else if (strstr (msg, "DO4=0") == msg)
     {
         LATGbits.LATG14   = 1 ; //LED 4 off
     }
          else if (strstr (msg, "DO5=0") == msg)
     {
         LATGbits.LATG12   = 1 ; //LED 5 off
     }

 }

从上面的代码中可以看出,例如,当单词"DO1=1"在超级终端中输入时,LED1将打开,"DO1=0"将关闭LED。与DO1相同,直到DO5。答案取决于LATGbits的类型的定义。

2 个答案:

答案 0 :(得分:2)

由于它完全由互斥选项组成,因此您可以通过一些明智的重构来摆脱所有else if位。

此外,您对字符串进行比较的方式意味着他们必须处于开始状态,因此您可以使用strncmp

并且,当你可以发送字符串文字时,不需要将字符串文字复制到缓冲区然后发送缓冲区。

进行这些更改会产生如下代码:

#define okayReturn { sendString("OK"); return; }
void decode (unsigned char* msg) {
    if (strncmp (msg, "DO1=1", 5) == 0) {
        LATGbits.LATG1 = 1;
        okayReturn;
    }

    if (strncmp (msg, "DO2=1", 5) == 0) {
        LATGbits.LATG0 = 0;
        okayReturn;
    }

    :

    if (strncmp (msg, "DO5=0", 5) == 0) {
        LATGbits.LATG12 = 1;
        return;
    }
}

另一种方法是将字符串拆分为三个部分(DOn=v,其中n是数字1..5和{{}之一1}}是v0)。

然后,您可以使用变量指针组合数据驱动方法,例如:

1

请注意使用#include <ctype.h> void decode (unsigned char* msg) { // Variables to change for each n in DOn=v static int *vars[] = { &LATGbits.LATG1, &LATGbits.LATG0, &LATGbits.LATG13, &LATGbits.LATG14, &LATGbits.LATG12 }; // Check content, allowing for upper/lower case. msg[0] = toupper (msg[0]); msg[1] = toupper (msg[1]); if ((msg[0] != 'D') && (msg[1] != 'O')) return; if ((msg[2] < '1') || (msg[2] > '5')) return; if (msg[3] != '=') return; if ((msg[4] != '0') && (msg[4] != '1')) return; // Special case for LED 1 vs 2-5. int on = (msg[2] == '1') ? 1 : 0; // All content validated, make change, first turning on. if (msg[4] == '1') { *(vars[msg[2] - '1']) = on; sendString("OK"); return; } // Or turning off. *(vars[msg[2] - '1']) = 1 - on; } 强制前两个字符为大写。这允许您输入任何一种情况,它将被视为相同。如果您需要区分大小写,只需删除这两行。

虽然这稍微复杂一点,但如果您决定稍后添加更多LED,尤其会更短。

请记住,仅当toupper()中的变量实际可寻址时,这才有效。 赢得的情况如果他们是位字段,但即使这样,您也可以使用上面的一些缩短方法来最小化代码长度,从而使其更易于维护:

vars

如果您想添加LED,那么它仍然很短,只有不易扩展。但是,如果您必须更新位字段,它仍然结构良好且易于理解。

答案 1 :(得分:1)

您可以改为:

unsigned char text[50];
void decode (unsigned char* msg)
{
    int on = 0;
    // ON LED
    if (strstr (msg, "DO1=1") == msg)
    {
        LATGbits.LATG1 =1 ; //led1 on
        on = 1;
    }
    else if (strstr (msg, "DO2=1") == msg)
    {
        LATGbits.LATG0 = 0 ; //LED 2 on
        on = 1;
    }
    else if (strstr (msg, "DO3=1") == msg)
    {
        LATGbits.LATG13   = 0 ; //LED 3 on
        on = 1;
    }
    else if (strstr (msg, "DO4=1") == msg)
    {
        LATGbits.LATG14   = 0 ; //LED 4 on
        on = 1;
    }
    else if (strstr (msg, "DO5=1") == msg)
    {
        LATGbits.LATG12   = 0 ; //LED 5 on
        on = 1;
    }

    // OFF LED
    else if (strstr (msg, "DO1=0") == msg)
    {
        LATGbits.LATG1 =0 ; //LED 1 off
    }
    else if (strstr (msg, "DO2=0") == msg)
    {
        LATGbits.LATG0    = 1 ; //LED 2 off
    }
    else if (strstr (msg, "DO3=0") == msg)
    {
        LATGbits.LATG13   = 1 ; //LED 3 off
    }
    else if (strstr (msg, "DO4=0") == msg)
    {
        LATGbits.LATG14   = 1 ; //LED 4 off
    }
    else if (strstr (msg, "DO5=0") == msg)
    {
        LATGbits.LATG12   = 1 ; //LED 5 off
    }

    if (on)
    {
        sprintf(text,"OK"); // Send the result in HyperTerminal
        sendString(text) ;
    }
}