【问题标题】:Converting the output of a void method to String in C [closed]在 C 中将 void 方法的输出转换为字符串 [关闭]
【发布时间】:2014-08-13 02:34:52
【问题描述】:

我写了一个 void 函数,它接受一个无符号整数。然后我在主函数中调用它。我希望输出为字符串,以便出于格式化原因将其包含在printf 语句中。但由于我调用的是 void 函数,我无法告诉 printf 它是一个字符串 (%s) 或一个 int (%d)。如何在我的 main 中获取这个称为 void 函数的输出并将其转换为某种字符串或整数?

【问题讨论】:

  • 显示函数声明。如果如您所说,void fn(....),那么您将无法做您正在尝试的事情。 void 表示没有返回值。
  • void something (unsigned int x){} 什么都不返回。然后在我的main,我打电话给something(some value)
  • void 表示您没有返回任何数据stackoverflow.com/a/3487716/2265932
  • @user3754974 “它的输出”是什么意思?它在计算什么?是printf 输出?
  • 并非如此。您应该阅读有关 C 编程的更多信息。你看起来很困惑。

标签: c string int


【解决方案1】:

一个函数声明为例如void foo(int); 没有结果。所以你不能将其不存在的结果转换为整数或字符串。

注意 C 没有严格意义上的 string 数据类型。您使用指向由char 组成的内存区域的指针,并使用零终止字符串的约定。

也许您希望将函数的输出(使用printffprintffputs 和其他stdio(3) 标准库函数完成)作为字符串。在 Linux(和 GNU libc)系统上,您可以使用 open_memstream(3)

不要将函数的输出与其结果混淆!

假设你已经编写了一些输出函数,例如

void show_x(FILE*out, int x) { fprintf(out, "x=%d\n", x); }

然后您可以使用以下方法将其转换为 ptrbuf(在 Linux 上)这样的字符串:

char*ptrbuf=NULL;
size_t sizbuf=0;
FILE* outmem = open_memstream(&ptrbuf, &sizbuf);
if (!outmem) { perror("open_memstream"); exit(EXIT_FAILURE); };
show_x(outmem, 42);
fflush(outmem);
printf ("now ptrbuf is %s\n", ptrbuf);
fclose(outmem);
// you later should free the `malloc`-ed `ptrbuf`
free (ptrbuf), ptrbuf=NULL;
sizbuf=0;

【讨论】:

  • 考虑到 OP 明显的 n00bish-ness,open_memstream 在这里似乎有点沉重。
  • 我几乎不会认为我是菜鸟。也许你曾经是一个初学者。但我同意,这对我来说似乎有点硬核。可能我还不明白。
  • 对不起,如果您对此感到不快,“初学者”就是我真正的意思。我们曾经都是菜鸟:-)
【解决方案2】:

void 函数不返回任何内容。将其返回类型更改为 const char* 以返回 C 字符串:

#include <stdio.h>

const char* func_that_returns_string(unsigned int x)
{
    switch (x) {
    case 0:  return "zero";
    case 1:  return "one";
    default: return "who needs any other numbers?";
    }
}

int main(void)
{
    int i = 3;
    const char* str;

    str = func_that_returns_string(i);

    printf("%d: %s\n", i, str);

    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-20
    • 2016-07-06
    • 2014-03-15
    • 2015-11-23
    • 1970-01-01
    • 2021-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多