我如何获得:
int i = 1023
到:
char string[4] = "1023"
这是我尝试过的代码:
#include <stdio.h>
main(){
int avg_adc = 1023;
char myString[4];
sprintf(myString, "%d", avg_adc);
}
//Output returned 4
main(){
int avg_adc = 1023;
char myString[4];
snprintf(myString, 4, "%d", avg_adc);
}
//Output returned 4
这些输出不是myString == char myString[4] = "1023";
吗?
我真的很困惑如何获得我需要的输出。
答案 0 :(得分:9)
你需要为myString分配5个元素(&#39; 1&#39;,&#39; 0&#39;,&#39; 2&#39;,&#39; 3&#39;,&# 39; \ 0&#39)
#include <stdio.h>
int main(void){
int avg_adc = 1023;
char myString[5];
sprintf(myString, "%d", avg_adc);
printf("%s\n", myString);
return 0;
}
答案 1 :(得分:1)
从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: %d\n", charsWritten);
printf("myString=%s, expected %d\n", myString, avg_adc);
}
我的系统输出:
TROUBLE :-(
Returned: 4
myString=102, expected 1023
换句话说,您需要检查snprintf
的返回值。如果测试失败,则结果字符串被截断,并且它必须是一个大于返回值的字符,以适合您希望它存储的所有字符,假设不返回负值。声明char myString[5];
会产生以下输出:
OK :-)
答案 2 :(得分:0)
myString
的内存中表示如下所示:
--- --- --- --- ---
myString: | 1 | 0 | 2 | 3 |\0 |
--- --- --- --- ---
即。 char
数组以空字符'\0'
终止,您忘记为其分配内存。
在您的代码中,如果您要存储int avg_adc = 1023;
,则应考虑额外的char
,并将数组定义为:
char myString[5];
答案 3 :(得分:-2)
#include <stdio.h>
main()
{
int avg_adc = 1023;
char myString[4];
sprintf(myString, "%d", avg_adc);
printf("%s",myString); //you forgot this..
}