我有两个整数,我想将它们合并成一个字符串 以下方式:例如,给定
xx=555
,yy=3
,我希望字符串为: "555-03
"。在我的例子中,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;
}
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-03n"
return 0;
}