我正在制作一个Arduino供电的时钟,在这个过程中,我正在尝试将整数格式化为两位数字格式的字符串,以便读出时间(例如1到“01”)。
以下内容给出了“错误:'{'token'之前的预期primary-expression:
char * formatTimeDigits (int num) {
char strOut[3] = "00";
if (num < 10) {
strOut = {'0', char(num)};
}
else {
strOut = char(num);
}
return strOut;
}
我正在尝试使用它如下:
void serialOutput12() {
printWeekday(weekday); // picks the right word to print for the weekday
Serial.print(", "); // a comma after the weekday
Serial.print(hour12, DEC); // the hour, sent to the screen in decimal format
Serial.print(":"); // a colon between the hour and the minute
Serial.print(formatTimeDigits(minute)); // the minute
Serial.print(":"); // a colon between the minute and the second
Serial.print(formatTimeDigits(second)); // the second
}
关于我在这里缺少什么的想法?
答案 0 :(得分:9)
花括号语法对于变量的初始声明有效,但在事后不能用于赋值。
此外,您将返回一个指向自动变量的指针,该变量在返回后不再有效分配(并且将在下一次调用时被粉碎,例如print
)。你需要做这样的事情:
void formatTimeDigits(char strOut[3], int num)
{
strOut[0] = '0' + (num / 10);
strOut[1] = '0' + (num % 10);
strOut[2] = '\0';
}
void serialOutput12()
{
char strOut[3]; // the allocation is in this stack frame, not formatTimeDigits
printWeekday(weekday); // picks the right word to print for the weekday
Serial.print(", "); // a comma after the weekday
Serial.print(hour12, DEC); // the hour, sent to the screen in decimal format
Serial.print(":"); // a colon between the hour and the minute
formatTimeDigits(strOut, minute);
Serial.print(strOut); // the minute
Serial.print(":"); // a colon between the minute and the second
formatTimeDigits(strOut, second);
Serial.print(strOut); // the second
}
答案 1 :(得分:1)
在C中,你不能用=
赋值运算符直接设置数组的内容(你可以初始化一个数组,但这是另一回事,即使看起来很相似)
此外:
char(value)
功能/操作员做你想要的;和strOut
数组的指针,则必须使其具有静态存储持续时间。执行所需操作的简单方法是sprintf
:
char * formatTimeDigits (int num)
{
static char strOut[3];
if (num >= 0 && num < 100) {
sprintf(strOut, "%02d", num);
} else {
strcpy(strOut, "XX");
}
return strOut;
}
答案 2 :(得分:0)
一些事情:
strOut = {'0', (char)num};
对于第一个问题,分配给数组元素:
strOut[0] = '0';
strOut[1] = num;
strOut[2] = '\0';
对于第二个问题,解决方案有点复杂。最好的方法是将目标字符串传递给FormatTimeDigits()
函数,让调用者担心它。
FormatTimeDigits(char *destination, int num); /* prototype */
FormatTimeDigits(char *destination, size_t size, int num); /* or another prototype */
第一项还有一点:你可能在初始化中看到了类似的东西。这与赋值不同,它允许类似外观的构造作为赋值。
char strOut[] = {'a', 'b', 'c', '\0'}; /* ok, initialization */
strOut = {'a', 'b', 'c', '\0'}; /* wrong, cannot assign to array */