首页 > 解决方案 > 如何从要在 C 中的 printf 中使用的函数返回字符串?

问题描述

我的函数需要返回一个字符串,并使用索引构建它。理想情况下,我想在 printf() 中使用该返回值。我知道,鉴于我的返回类型,我需要返回一个 char 字符串指针,但我不能将 reg 设为字符串指针,因为我需要访问单个元素。另外,我知道我需要 malloc() 它,但我不知道如果将它用作 printf 的参数,我将如何释放该内存。

这是我的代码:

char * printRegister(int num) {
    char reg[] = "$error";
    memset(reg, 0, sizeof(reg));
    switch(num)
    {
        case 0:
            strcpy(reg, "$zero");
            break;
        case 1:
            strcpy(reg, "$at");
            break;
        case 2:
        case 3:
            reg[0] = '$';
            reg[1] = 'v';
            reg[2] = num - 2 + '0';
            reg[3] = '\0';
            break;
        case 4:
        case 5:
        case 6:
        case 7:
            reg[0] = '$';
            reg[1] = 'a';
            reg[2] = num - 4 + '0';
            reg[3] = '\0';
            break;
        case 8:
        case 9:
        case 10:
        case 11:
        case 12:
        case 13:
        case 14:
        case 15:
            reg[0] = '$';
            reg[1] = 't';
            reg[2] = num - 8 + '0';
            reg[3] = '\0';
            break;
        case 16:
        case 17:
        case 18:
        case 19:
        case 20:
        case 21:
        case 22:
        case 23:
            reg[0] = '$';
            reg[1] = 's';
            reg[2] = num - 16 + '0';
            reg[3] = '\0';
            break;
        case 24:
        case 25:
            reg[0] = '$';
            reg[1] = 't';
            reg[2] = num - 16 + '0';
            reg[3] = '\0';
            break;
        case 26:
        case 27:
            reg[0] = '$';
            reg[1] = 'k';
            reg[2] = num - 26 + '0';
            reg[3] = '\0';
            break;
        case 28:
            strcpy(reg, "$gp");
            break;
        case 29:
            strcpy(reg, "$sp");
            break;
        case 30:
            strcpy(reg, "$fp");
            break;
        case 31:
            strcpy(reg, "$ra");
            break;
        default:
            strcpy(reg, "error");
            break;
    }
    return reg;
}

有没有办法做到这一点?

标签: cc-strings

解决方案


如何从要在 C 中的 printf 中使用的函数返回字符串?

对于 C99 或更高版本,使用复合文字进行临时字符串存储。

首先,重写printRegister()以接受char *缓冲区。

#define  printRegister_N 7
// char * printRegister(int num) {
char * printRegister(char *reg, int num) {
  // char reg[] = "$error";
  // memset(reg, 0, sizeof(reg));
  memset(reg, 0, printRegister_N);  // not really needed anymore with compound literal
  ...
  return reg;
}

printRegister()形成一个用复合文字调用的宏。

//                                   v---------------------------v  compound literal
#define PRINT_REG(num) printRegister((char [printRegister_N]){ 0 }, (num))

然后调用PRINT_REG(num)。返回的char*(它是一个指向 复合文字的指针)在块结束之前都是有效的。不*alloc()free()需要。

printf("1st:%s  2nd:%s\n", PRINT_REG(0), PRINT_REG(1));

代码仍然使用通常的装饰来"%s"喜欢"%-7s""%.*s"等。


推荐阅读