你如何从数字中提取数字?

时间:2013-05-02 03:00:05

标签: c microcontroller

之前我问了类似的问题,但答案并不完全是我想要的,所以这次我会提供更多细节。

我是第一次使用C语言编写微控制器。我有一个Android APP,允许用户选择颜色组合(RGB颜色),然后将颜色代码发送到微控制器。微控制器根据所选内容显示灯光。

我试图做的是能够一次读取四位数字。因此,如果发送的号码是2005001000200,我想执行以下操作。

提取第一个数字并将其保存在一个名为mode的变量中。然后..提取下四个数字并将它们保存在一个名为red的变量中。然后......提取下四个数字并将它们保存在一个变量中称为绿色..然后..提取最后四位数并将它们保存在一个名为blue的变量中。所以输出应该是这样的......

模式= 2

红色= 0050

绿色= 0100

蓝色= 0200

如果我能看到一个例子来说明我想要做的事情会很棒。请记住,我是第一次编程微控制器。非常感谢你!

3 个答案:

答案 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...
}