首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用sprintf简化语句?

如何用sprintf简化语句?
EN

Stack Overflow用户
提问于 2015-09-01 04:27:28
回答 2查看 118关注 0票数 0

有可能用sprintf简化这个语句吗?

代码语言:javascript
复制
 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"在HyperTerminal中键入时,LED1将打开,"DO1=0"将关闭该LED。DO1也是一样,直到DO5。答案取决于LATGbits类型的定义。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-01 04:45:09

由于它完全由相互排斥的选项组成,所以您可以通过一些明智的重构来消除所有的else if位。

此外,您比较字符串的方式意味着它们必须处于开始阶段,这样您就可以使用strncmp了。

而且,当您只需要发送字符串文本时,不需要将字符串文本复制到缓冲区,然后发送缓冲区。

进行这些更改将导致代码如下:

代码语言:javascript
复制
#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..5v01)。

然后,可以使用变量指针将数据驱动的方法组合在一起,例如:

代码语言:javascript
复制
#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;
}

注意使用toupper()强制前两个字符大写。这允许您输入任何一种情况,并将得到相同的待遇。如果您需要区分大小写,只需删除这两行。

虽然这有点复杂,但它要短得多,特别是如果你以后决定增加更多的LED。

请记住,只有在vars中的变量实际上是可寻址的情况下,这才能工作。如果它们是位字段,则不会出现这种情况,但即使这样,您也可以使用上面的一些缩短方法来最小化代码长度,从而使代码更易于维护:

代码语言:javascript
复制
#include <ctype.h>

void decode (unsigned char* msg) {
    // 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;

    // All content validated, make change, either turning off.

    if (msg[4] == '0') {
        switch (msg[2]) {
            case '1': LATGbits.LATG1 = 0; break;
            case '2': LATGbits.LATG0 = 1; break;
            case '3': LATGbits.LATG13 = 1; break;
            case '4': LATGbits.LATG14 = 1; break;
            case '5': LATGbits.LATG12 = 1; break;
        }
        return;
    }

    // Or turning on.

    switch (msg[2]) {
        case '1': LATGbits.LATG1 = 1; break;
        case '2': LATGbits.LATG0 = 0; break;
        case '3': LATGbits.LATG13 = 0; break;
        case '4': LATGbits.LATG14 = 0; break;
        case '5': LATGbits.LATG12 = 0; break;
        default:  return;
    }
    sendString("OK");
}

这仍然是很短的,只有一点点不容易扩展,如果你想要增加LED。然而,如果您必须更新位字段,它仍然是良好的结构和易于理解。

票数 2
EN

Stack Overflow用户

发布于 2015-09-01 04:38:38

你可以改为这样:

代码语言:javascript
复制
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) ;
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32323535

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档