如何从:
int i = 1023
:
char string[4] = "1023"
这是我尝试的代码:
尝试1
#include <stdio.h>
main(){
int avg_adc = 1023;
char myString[4];
sprintf(myString, "%d", avg_adc);
}
//Output returned 4
尝试2
main(){
int avg_adc = 1023;
char myString[4];
snprintf(myString, 4, "%d", avg_adc);
}
//Output returned 4
这些输出不等于myString == char myString[4] = "1023";
吗?
我真的很困惑如何得到我需要的输出。
您需要为myString('1','0','2','3',' ')分配5个元素
#include <stdio.h>
int main(void){
int avg_adc = 1023;
char myString[5];
sprintf(myString, "%d", avg_adc);
printf("%sn", myString);
return 0;
}
来自ISO C11草案n1570:
sprintf
函数返回写入数组的字符数,不计算结束的空字符,如果是,则为负值编码错误。
也就是说,
的返回值sprintf(myString, "%d", 1023);
确实是4,但它实际上将5个字符写入myString
。snprintf
显示了更多信息,它限制了写入指定值的字符数量,并且这个数字应该考虑到终止的空字符:
因此,当且仅当,以null结尾的输出已完全写入如果返回值非负且小于[指定的限制]。
int avg_adc = 1023;
char myString[4];
int charsWritten;
charsWritten = snprintf(myString, sizeof(myString), "%d", avg_adc);
if (charsWritten >= 0 && charsWritten < sizeof(myString)) {
printf("OK :-)n");
} else {
printf("TROUBLE :-(n");
printf("Returned: %dn", charsWritten);
printf("myString=%s, expected %dn", myString, avg_adc);
}
系统输出:
TROUBLE :-(
Returned: 4
myString=102, expected 1023
也就是说,需要检查snprintf
的返回值。如果测试失败,那么您的结果字符串被截断,并且它需要比返回值大一个字符,以容纳您希望它存储的所有字符,假设不返回负值。声明char myString[5];
会得到以下输出:
OK :-)
myString
的内存表示如下:
--- --- --- --- ---
myString: | 1 | 0 | 2 | 3 | |
--- --- --- --- ---
。char
数组以空字符' '
结束,您忘记为其分配内存。
在您的代码中,如果您想存储int avg_adc = 1023;
,您应该考虑一个额外的char
,并将数组定义为:
char myString[5];
#include <stdio.h>
main()
{
int avg_adc = 1023;
char myString[4];
sprintf(myString, "%d", avg_adc);
printf("%s",myString); //you forgot this..
}