2016-04-15 130 views
1

我想将数字12转换为0012.因此,数字总是4个字符长。我试着用下面的代码:将前导零加到整数不起作用(arduino,c)

int number; 
int result; 

void setup() { 
    number = 12; 
    Serial.begin(9600); 
    result = printf("%03d", number); 
} 

void loop() { 
    Serial.println(result); 
} 

但是,这段代码只输出-1而不是0012.这段代码有什么问题?

回答

4

整数不能识别前导零的格式。

存储这种类型的信息的唯一方法是使用一个字符串(如char[]而不是一个整数,但它看起来像你只是写出的值,所以你不应该需要它的变量(如printf()会处理,对于你)

// %04d% will pad your number to 4 digits 
printf("%04d", number); 

如果你确实需要存储你的价值,你可以使用sprintf()并宣布你result,如下图所示:

int number; 
char *result = malloc(5); 

,然后将其设置你的setup()功能内,如:

sprintf(result, "%04d", number); 

同时使用这些变化,你更新的代码可能看起来像:

int number; 
char *result = malloc(5); 

void setup() { 
    number = 12; 
    Serial.begin(9600); 
    sprintf(result, "%04d", number); 
} 

void loop() { 
    Serial.println(result); 
} 

考虑一下,当你在它们输出格式化你的价值观,否则您可以使用整数值来执行任何算术和计算。

+0

这个问题最初是用'C#'标记的。基本的想法仍然保持不变。 'result'需要是一个字符串,而不是整数。 –

+0

好的。感谢那!有没有可能用一个整数做到这一点? – manIneedHelp

+1

正如我所提到的,整数不能包含任何类型的格式信息,前导零可以被认为是。真正的问题是你需要一个变量来存储结果吗?还是只是输出它?如果是这种情况,那么你不需要定义'result'或者将它设置为等于你的'printf()'调用。 –

2

代码的问题在于,您正在打印'printf'调用的返回值。它返回打印的字符数。由于它看起来像stdio尚未设置,它返回-1作为错误标志。仔细阅读手册页。

在此行中:

result = printf("%03d", number); 
我们想用 'sprintf的',而不是 'printf的'

'sprintf'需要将其输出字符串放在某处。也许预分配它,确保它比最长的输出字符串加1(保存终止的nul字符)更大。不要在'setup'中分配它,而是将它放在任何例程之外(因为你在一个例程中初始化它,并在另一个例程中使用它)。

char buf[6]; 

r = sprintf(buf, "%04d", number); 

// now print the string inside of 'buf' 
Serial.println(buf);