之前我问了类似的问题,但答案并不完全是我想要的,所以这次我会提供更多细节。
我是第一次使用C语言编写微控制器。我有一个Android APP,允许用户选择颜色组合(RGB颜色),然后将颜色代码发送到微控制器。微控制器根据所选内容显示灯光。
我试图做的是能够一次读取四位数字。因此,如果发送的号码是2005001000200,我想执行以下操作。
提取第一个数字并将其保存在一个名为mode的变量中。然后..提取下四个数字并将它们保存在一个名为red的变量中。然后......提取下四个数字并将它们保存在一个变量中称为绿色..然后..提取最后四位数并将它们保存在一个名为blue的变量中。所以输出应该是这样的......
模式= 2
红色= 0050
绿色= 0100
蓝色= 0200
如果我能看到一个例子来说明我想要做的事情会很棒。请记住,我是第一次编程微控制器。非常感谢你!
答案 0 :(得分:7)
假设我2005001000200ULL
位于某个地方unsigned long long
:
unsigned long long value = 2005001000200ULL;
如果我想提取blue
,我会使用模运算:
unsigned long long value = 2005001000200ULL;
unsigned int blue = value % 10000;
要提取绿色,我会使用除法运算,然后进行相同的模运算:
unsigned long long value = 2005001000200ULL;
unsigned int blue = value % 10000; value /= 10000;
unsigned int green = value % 10000;
要提取红色,请重复此过程:
...
unsigned long long value = 2005001000200ULL;
unsigned int blue = value % 10000; value /= 10000;
unsigned int green = value % 10000; value /= 10000;
unsigned int red = value % 10000; value /= 10000;
unsigned int mode = value;
嘿!我错过了一步! :(
答案 1 :(得分:5)
如果发送的号码格式是固定的,那么如果您正在使用键盘阅读,则可以使用以下逻辑:
scanf("%1d%4d%4d%4d",&mode,&red,&green,&blue);
那就可以胜任。
如果它在文件中,请使用fscanf()
来执行此操作。我确信使用fscanf()
是众所周知的。
虽然我们在这里,如果这个数字是一个字符串,那么你可以简单地使用sscanf()
和类似的格式说明符字符串。
完整的使用示例:
double input = 2005001000200;
char buffer[14];
sprintf(buffer, "%f", input);
int mode, red, green, blue;
sscanf(buffer, "%1d%4d%4d%4d",&mode,&red,&green,&blue);
答案 2 :(得分:1)
假设您的值存储为字符串s
,您可以执行以下操作:
int mode, r, g, b, n;
if((4 == sscanf(s, "%1d%4o%4o%4o%n", &mode, &r, &g, &b, &n)) && (13 == n)) {
// Correctly scanned mode, red, green, and blue
// Do what you need to do...
} else {
// Failed to scan
// Handle error...
}