c - 如何从要在 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;
}
有没有办法做到这一点?
解决方案
如何从要在 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"
等。
推荐阅读
- css - 如何使用 Visual Studio Code(在 Mac 上)禁用 HTML 文件的 CSS 错误
- python - 将递归复制方法添加到 Python 中的链表实现?
- typescript - 类型对象中缺少尝试访问角度 6 属性 ID 中的对象数据
- ios - PHAssetChangeRequest 后元数据未更新
- asp.net-core - Asp.Net Core Web 应用程序中的 SeriLog 未正确注入依赖项
- java - 执行的菜单侦听器操作
- java - SampleResult: 无法转换字符串 'XXXX' ,使用默认编码:UTF-8,java.io.UnsupportedEncodingException
- c# - 在异步 Azure 函数中捕获异常的位置
- javascript - 如何在本地测试 document.referrer?
- c# - LinqToExcel 加载字典