整数转字符串方法

integer to string method

我正在尝试创建一个整数(字符串最多四位数字)。 这是我的方法:

char  *ToInt( int Value)
{
    char buffer[4];
    sprintf(buffer, "%04d", Value);
    return buffer;
}

之后,字符串被分成每个字节,并将其发送到一个 7 段 LCD。 问题是我正在接受警告

 warning: (365) pointer to non-static object returned

还有所有这些错误

 C:\Program Files (x86)\Microchip\xc8\v1.45\sources\common\doprnt.c:538: warning: (373) implicit signed to unsigned conversion
C:\Program Files (x86)\Microchip\xc8\v1.45\sources\common\doprnt.c:541: warning: (373) implicit signed to unsigned conversion
C:\Program Files (x86)\Microchip\xc8\v1.45\sources\common\doprnt.c:1259: warning: (373) implicit signed to unsigned conversion
C:\Program Files (x86)\Microchip\xc8\v1.45\sources\common\doprnt.c:1305: warning: (373) implicit signed to unsigned conversion
C:\Program Files (x86)\Microchip\xc8\v1.45\sources\common\doprnt.c:1306: warning: (373) implicit signed to unsigned conversion
 C:\Program Files (x86)\Microchip\xc8\v1.45\sources\common\doprnt.c:1489: warning: (373) implicit signed to unsigned conversion
C:\Program Files (x86)\Microchip\xc8\v1.45\sources\common\doprnt.c:1524: warning: (373) implicit signed to unsigned conversion

您正在尝试 return buffer 已在堆栈上分配 space。

堆栈在函数 return 后立即销毁。所以 returned 值现在只是一个悬空指针。

此外,缺少空终止符。

正如在评论和其他答案中已经提到的,returning 局部变量(又名 buffer)是你永远不应该做的事情,因为一旦函数 return.

此外,您的缓冲区太小,无法容纳 4 个字符,因为 C 中的字符串需要一个额外的字符来零终止字符串。因此,要持有 4 个角色,您(至少)需要 buffer[5]。但是,请注意 %04d 并不能确保正好打印 4 个字符。高 int 值将产生更多字符并导致(更多)缓冲区溢出。所以你需要一个缓冲区来保存最大(可能是负数)整数的打印。

那么你可以做什么呢?

你有两个选择。 1) 在函数内部使用动态内存分配或 2) 让调用者为函数提供目标缓冲区。

它可能看起来像:

#include <stdio.h>
#include <stdlib.h>

// The maximum number of chars required depends on your system - see limits.h
// Here we just use 64 which should be sufficient on all systems
#define MAX_CHARS_IN_INT 64

char* intToMallocedString(int Value)
{
    char* buffer = malloc(MAX_CHARS_IN_INT);  // dynamic memory allocation
    sprintf(buffer, "%04d", Value);
    return buffer;
}

// This could also be a void function but returning the buffer
// is often nice so it can be used directly in e.g. printf    
char* intToProvidedString(char* buffer, int Value)
{
    sprintf(buffer, "%04d", Value);
    return buffer;
}

int main(void) {
    int x = 12345678;
    char str[MAX_CHARS_IN_INT];  // memory for caller provided buffer

    char* pStr = intToMallocedString(x);
    intToProvidedString(str, x);
    printf("%s - %s\n", str, pStr);

    free(pStr);    // dynamic memory must be free'd when done
    return 0;
}

输出:

12345678 - 12345678