如何将数组中的字符串转换为无符号整数?

时间:2018-05-23 07:06:17

标签: c type-conversion

我有以下代码:

char switch_list[] = {
    "PINB >> 7", 
    "PIND >> 1", 
    "PINB >> 1", 
    "PIND >> 0}"
};

void values(void){
    uint8_t switch_value = 0;
        if (i == 0){
            switch_value = (PINB >> 7) & 1; 
        }
        if (i == 1){
            switch_value = (PIND >> 1) & 1;
        }
        if (i == 2){
            switch_value = (PINB >> 1) & 1;
        }
        if (i == 3){
            switch_value = (PIND >> 0) & 1;
        }
        SOME OTHER OPERATIONS GO HERE
}

我需要以某种方式将 switch_list 值解释为无符号整数,但我无法对数组进行任何更改(它需要保留为char数组)。 PINB 和其他人已在库中定义了8位值。我想创建一个看起来像这样的for循环:

uint8_t switch_value = 0;
    for (int i = 0, i < sizeof(switch_list)/sizeof(switch_list[0]); i++){
            switch_value = **********[i] & 1; 
         SOME OTHER OPERATIONS GO HERE
        }
}

*********与 switch_list 相同,但不是char类型,而是 uint8_t 。任何人都可以提供任何提示吗?

2 个答案:

答案 0 :(得分:1)

您可以使用有关数组的知识并创建一个函数,将值从"PINB >> 7"转换为PINB >> 7。我做的假设是:

  1. 字符串始终以&#34; PIN&#34;然后有一个&#34; B&#34;或者&#34; D&#34; (可以轻松修改)
  2. 然后该字符串将执行操作(目前我只支持&#34;&gt;&gt;&#34;但这也很容易修改)
  3. 字符串中的最后一个字符是1个字符编号(同样,可以根据您对字符串的了解进行修改)
  4. 使用它,我可以创建一个convert函数

    unsigned int convert(char * p);
    
    /* PINB and the others have defined 8 bit value in the libraries
       so I'm making up their values here for convenience */
    unsigned int PINB = 1024;
    unsigned int PIND = 2048;
    
    int main(){
        // deleted your ending }
        // and changed the type of the array
        char* switch_list[] = {
            "PINB >> 7", 
            "PIND >> 1", 
            "PINB >> 1", 
            "PIND >> 0"
        };
    
        unsigned int switch_value;
        // , should be ;
        // don't compare signed with unsigned
        for (unsigned int i = 0; i < sizeof(switch_list)/sizeof(switch_list[0]); i++){
            switch_value = convert(switch_list[i]); 
            printf("%u\n", switch_value);
        }
    
        return 0;
    }
    
    // assuming string must be exactly long as "PINB >> 7"
    unsigned int convert(char * p){
        if(!p || strlen(p) != strlen("PINB >> 7")){
            printf("error\n");
            return (unsigned)-1;
        }
    
        unsigned int n;
        // use a string compare or, in your case, since only the 4th char is different:
        if(p[3] == 'B')
            n = PINB;
        if(p[3] == 'D')
            n = PIND;
        // note I'm not handling a case where the 4th letter isn't {'B', 'D'}, according to my assumption (the 1st).
    
        // use your knowledge about the string inside switch_list
        return n >> (p[strlen(p) - 1] - '0');
    }
    

答案 1 :(得分:1)

假设PINx项将评估为PIN_T类型,您可以这样做:

#include <stdlib.h> /* for size_t */
#include <inttypes.h> /* for uint8_t */

/* other include here */


struct switch_s
{
  PIN_T * ppin;
  uint8_t offset;
};

struct switch_s switches[] =
{
  {&PINB, 7},
  {&PIND, 1},
  {&PINB, 1},
  {&PIND, 0},
  /* more here */
};

int main(void)
{ 
  for (size_t i; i < sizeof switches / sizeof *switches; ++i)
  {
    uint8_t switch_value = (*switches[i].ppin >> switches[i].offset) & 1;

    /* Work with switch_value here ... */
  }
}