C语言中将整数型变量转换为字符型字符串

3

我怎样从以下位置开始:

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

Attempt 2

main(){

    int avg_adc = 1023;
    char myString[4];
    snprintf(myString, 4, "%d", avg_adc); 
}  
//Output returned 4

这些输出结果是不是说明了myString == char myString[4] = "1023";

我真的很困惑如何得到我需要的输出。


4
“1023”是一个由五个符号组成的字符串。你只在堆栈上分配了四个符号的空间。 - Ari0nhh
1
你的意思是什么?你的代码没有输出任何东西。 - Nisse Engström
是的,我在解决问题时意识到了这一点。最终我采用了另一种方法,但我很感激你的帮助。 - Arch
1
如果您自己的解决方案可以解决这个问题,那么您可以将其添加为答案(甚至是鼓励这样做)。 - Jongware
4个回答

9

您需要为myString分配5个元素('1','0','2','3','\ 0')

#include <stdio.h>

int main(void){
  int avg_adc = 1023;
  char myString[5];
  sprintf(myString, "%d", avg_adc);
  printf("%s\n", myString);
  return 0;
}

谢谢,最终我选择了另一种方法,但是非常感谢您的帮助。我知道我已经接近成功了...RIP。 - Arch
@Arch 当然没问题。如果有帮助的话,您应该接受这个答案。 - jh314

1

来自ISO C11草案n1570:

sprintf函数返回数组中写入的字符数,不包括终止的空字符,或者如果出现编码错误则返回负值。

换句话说,

sprintf(myString, "%d", 1023);

实际上,myString 中写入了 5 个字符,尽管其值确实为 4。使用 snprintf 可以发现更多信息,该函数限制写入到指定值的字符数,这个值应该包括终止空字符:

因此,只有当返回值为非负且小于[指定限制]时,才完全写入以空字符结尾的输出。

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 :-)

0

myString 的内存表示如下:

            --- --- --- --- ---
myString:  | 1 | 0 | 2 | 3 |\0 |
            --- --- --- --- ---

char 数组以空字符 '\0' 结尾,你忘记分配内存了。

在你的代码中,如果你想存储 int avg_adc = 1023;,你应该考虑多一个 char 并将数组定义为:

char myString[5];

-2
#include <stdio.h>

main()
{
        int avg_adc = 1023;
        char myString[4];
        sprintf(myString, "%d", avg_adc);
        printf("%s",myString); //you forgot this..
}

如果这个答案对您有帮助,请接受这个答案。 - lucifer
4
你正在将一个5个字符的字符串储存在一个只有4个字符的数组中。 - Nisse Engström
然而,问题问的是为什么没有输出。问题中缺少输出函数_确实_解释了这一点... - Lundin
@NisseEngström 运行它,这个程序在告诉任何事情后会给出完美的输出... - lucifer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接