请问单片机c语言中可不可以把一个字符串转化成变量名?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请问单片机c语言中可不可以把一个字符串转化成变量名?相关的知识,希望对你有一定的参考价值。

sbit a1=P1^0;
sbit a2=P1^1;
sbit a3=P1^2;
void function setValue(unsigned char dt,unsigned char index)
-----

这个函数功能是为前面声明的某个变量赋值,比如调用setValue(10,2),运行结果就是a2==10,这个问题的关键是怎样根据传递来的index值来设置对应的变量,我不希望用if else或switch之类的写法,因为实际应用中我可能有几十个这样的变量。用a+index或=dt
“a”+index=dt显然都不行,该怎么写呢,谢谢!

参考技术A 我以前也这样想过,后来发现用指针能解决,先定义unsigned a1,a2,a3,……;
然后定义一个指针unsigned char *p;
运行p=&a1;
setValue(x,y)
p+=y-1;
*p=x;
如setValue(10,2)
结果a2就是10;
不懂追问
参考技术B 字符串末尾追加,可以用strcat,将你传递来的index追加到字符a后面,但是这要求你传入的是字符型。 参考技术C 用数组代替你的变量。
例如:你需要10个变量。
unsigned char cTable[10];
void function setValue(unsigned char dt,unsigned char index)

cTable[index] = dt;
追问

这个我也想到过,但是网上都说sbit型不支持数组定义

追答

抱歉,题没看清。

如果可以,那你改变一下程序的结构:

typedef enum
 
     PORT0,
     PORT1,
     PORT2,
     PORT3,
 enPORT;
void function setValue(enPORT Pn,unsigned char dt,unsigned char index)

    switch (Pn) 
    
       case  PORT0:
             if (dt == 1) P0 |= 1 << inde;
             else      P0 &= ~(1 << inde);
             break;
       case  PORT1:
             if (dt == 1) P1 |= 1 << inde;
             else      P1 &= ~(1 << inde);
             break;
    

       
 

如有错误请指正。

C语言中 怎样把一个int转换成char

大家好 我是编程新手,有如上问题,
譬如说 int a=8; 我要怎样 char b 把这个a转换成char。我懂如果a是固定的,就看ascii table来把b写死也是,但是我的a是个变量, 怎样表示char b呢?

谢谢!

内容为数字的char,包含
0,1,2,3,4,5,6,7,8,9
共计10个字符。
这十个字符在存为字符型时,其存储值为对应的ascii码,而这些ascii码是连续的,且按照其本身数字的大小来排列。
这样就可以将字符值,减去起始ascii码值实现转为对应值的效果。

int a; //转换的目标变量。
char c = \'7\'; //要转换的字符。
c = a - \'0\';
这样得到的就是对应的值了,即c = 7。
如果在文件中需要多次该操作,则可以定义一个带参宏,如下:
#define chartonumber(x) (x-\'0\')
这样只需要调用
c = chartonumber(a);
即可实现效果。
参考技术A 有个函数叫itoa,用法是这样的:
itoa(数字,目标字符串,进制),
如char str[100];
int num = 123;
itoa(num, str, 10);追问

谢谢回答 那这个函数需要加header吗?还是讲可以直接拿来用?

追答

要加头文件的,是#include
不过有一点需要注意:
itoa是广泛应用的非标准C语言扩展函数。由于它不是标准C语言函数,所以不能在所有的编译器中使用。但是,大多数的编译器(如Windows上的)通常在头文件中包含这个函数。
不过你也不用担心,只要你写的代码能通过编译并运行就行,只要知道有这件事就行了。

追问

可我用的程序不是visual studio 我的是用来把程序烧进单片机的。我没有这个header 我跑程序的时候 有错误。还有别的办法可以转换吗?

追答

据我所知,Keil 里面是有stdlib.h的吧。。你检查一些有没有书写错误。

不然我们自定义这个函数好了。。

#include<iostream>
#include<windows.h>
#include<string>
#include<cstdlib>
using namespace std;

void change(int num, char *str)

    int p = 0;
    int tmp = num;
    while(tmp)
    
        p++;
        tmp /= 10;
    
    if(num > 0)p--;
    tmp = num > 0 ? num : -num;
    while(tmp)
    
        str[p] = (tmp%10) + '0';
        p--;
        tmp /= 10;
    
    if(num < 0)str[0] = '-';


int main()

    char str[100];
    change(1234, str);
    change(-12345, str);
    printf("%s\\n", str);
    getchar();
    return 0;

写的可能比较粗糙,你可以看着改进改进。。

追问

谢谢你!我用的也不是keil 我用的是Flyport IDE 他的header format跟keil有区别,你的code 我这放进去试一下 如果不行 我尝试别的方法 不转换了,直接从别的地方串口读。but thank you anyway!! :)

追答

单片机硬件这些我不太懂,不过希望我的代码能起作用吧 :)

本回答被提问者采纳

以上是关于请问单片机c语言中可不可以把一个字符串转化成变量名?的主要内容,如果未能解决你的问题,请参考以下文章

请问C语言中如何将int转换为float

keil c中如何把字符串转化为整型 具体一点

C语言中如何把一个字符串转化成其ASCII码的数组??

c语言中怎么把不同类型转化成同一类型?

如何把浮点数转换成字符串?

C语言中怎么把Int型转成字符型?