【问题标题】:How to combine two integers into one string using C?如何使用C将两个整数组合成一个字符串?
【发布时间】:2017-11-14 12:05:44
【问题描述】:

我有两个整数,我想将它们组合成一个字符串 以下方式:例如,给定xx=555yy=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;
        }

【问题讨论】:

  • 首先检查printf 的工作原理:cplusplus.com/reference/cstdio/printfsprintf 做同样的事情,但将输出写入给定的字符串。
  • 您没有使用过any of the printf functions 在一次调用中打印出多个值吗?格式字符串中可以有很多格式规范。
  • 你需要一个数组,而不是指向无处的指针,来调用sprintf()。使用char str[32]; 就可以了。必要时,您可以使用%02d%.2d 获取前导零的两位数。有一部分情况可以说%.2d 表示法更好,但它有点脆弱。
  • 返回 str 是非法的。它是一个局部变量,你需要 malloc 一个字符串来返回
  • 这是一个编码研讨会吗?问题不应该是“移动目标”。

标签: c string int printf


【解决方案1】:

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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-27
    • 2013-12-25
    相关资源
    最近更新 更多