整数转字符串方法
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
我正在尝试创建一个整数(字符串最多四位数字)。 这是我的方法:
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