我有两个整数,我想将它们组合成一个字符串 以下方式:例如,给定
xx=555
,yy=3
,我希望字符串为: "555-03
&#34 ;.在我的情况下,yy
中的值类似于小时,因此它必须包含 两位数,但几天并不重要,并且存在差异 介于"555-03
"和"555-3
"。任何想法我怎么能做的事情 此?
这基本上我得到以下错误:函数返回局部变量的地址[-Wreturn-local-addr] 我的尝试:
#include <stdio.h>
#include <stdlib.h>
#include <stdlib.h>
static char* intToTimeDate(int day,int hour);
int main()
{
int hour=5555;
int curr_day=7;
char* curr_time=intToTimeDate(curr_day,hour);
printf("dd=%s",curr_time);
return 0;
}
static char* intToTimeDate(int day,int hour){
char str[16];
snprintf ( str, sizeof ( str) - 1, "%d-%02d", day,hour);
printf("str=%s",str);
return str;
}
答案 0 :(得分:0)
OP的代码工作,除了它返回一个指向局部变量的指针,一旦函数结束,它就是UB。而是将指针传递给有效内存以存储结果。
static char* intToTimeDate(char *str, int day,int hour){
sprintf(str, "%d-%02d", day, hour);
printf("str=%s",str);
return str;
}
目标字符串应足够宽,以容纳任何对int
值。
返回指向字符串的指针的解决方案涉及分配字符串。在C99之后,代码可以使用复合文字作为临时空间。从intToTimeDate()
返回的指针有效,直到块结束 - 复合文字的生命周期。
#include <limits.h>
#include <stdio.h>
static char* intToTimeDate(char *str, int day, int hour) {
sprintf(str, "%d-%02d", day, hour);
return str;
}
// Size needed to store a decimal string verison of `int`
#define INT_DEC_SIZE (sizeof(int)*CHAR_BIT/3 + 3)
// v--- compound literal ----------------------v
#define INTTOTIMEDATE(d,y) (intToTimeDate((char [INT_DEC_SIZE*2 + 2]){0}, (d), (y)))
int main(void) {
puts(INTTOTIMEDATE(555, 3)); // Output "555-03\n"
return 0;
}