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



我有以下代码:

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相同,但不是字符类型,而是uint8_t。任何人都可以提供任何提示吗?

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

  1. 字符串总是以"PIN"开头,然后有一个"B"或"D"(可以很容易地修改(
  2. 然后字符串将执行操作(目前我只支持">>",但这也可以很容易地修改(
  3. 字符串
  4. 中的最后一个字符是 1 个字符的数字(同样,可以根据您对字符串的了解进行修改(

使用它,我可以创建一个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("%un", 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("errorn");
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');
}

假设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 ... */
}
}

最新更新