首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >fputs和printf问题

fputs和printf问题
EN

Stack Overflow用户
提问于 2011-07-10 20:02:36
回答 5查看 954关注 0票数 0

我得到了如下代码:

代码语言:javascript
复制
char* writeSpace(int i)
{
 fputs("                              " + (30-i), stdout);
}

printf("#%i key: %s%svalue: %s%s value2: %s", id, key, writeSpace(10), value, writeSpace(8), value2);

我的输出应该类似于:

代码语言:javascript
复制
#1 key: foo          value: bar        value2: foobar

但事实并非如此。它看起来像:

代码语言:javascript
复制
                      #1 key: foo(null)value: bar(null)value2: foobar(null)

我的代码出了什么问题?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-07-10 20:11:26

好的,您正在将所有这些空格fput到控制台,所以您首先获得它们。

然后你会输出所有其他的东西,所以下一步你会得到它。

也许您的意思是让writeSpace返回一个C样式的字符串,而不是将其打印到控制台。

但是一定要为它分配空间!由于内存缓冲区的所有权变得有点麻烦,所以最好在函数之外分配空间。

代码语言:javascript
复制
void writeSpace(char* buf, int i) {
   fputs("                              " + (30-i), buf);
}

char spaceBuf1[30];
writeSpace(spaceBuf1, 10);

char spaceBuf2[30];
writeSpace(spaceBuf2, 8);

printf("#%i key: %s%svalue: %s%s value2: %s",
   id, key, spaceBuf1, value, spaceBuf2, value2);

并考虑使用iostreams和std::string等实际的C++功能。这会容易得多:

代码语言:javascript
复制
std::cout << "#" << id << " "
          << " key: " << std::setw(30) << key
          << " value: " << std::setw(30) << value
          << " value2: " << value2;

我推荐用these resources来学习惯用的C++。

票数 4
EN

Stack Overflow用户

发布于 2011-07-10 20:06:34

您已经声明writeSpace()返回一个char*,但是您没有从中返回任何内容。

票数 4
EN

Stack Overflow用户

发布于 2011-07-10 20:29:35

您的writeSpace函数不会返回新的字符串(尽管您已经这样声明了),而是直接写入终端。因为您在printf调用中将其作为参数调用,所以writeSpace首先被调用,打印它的内容,然后printf打印它的内容。你应该这样做:

代码语言:javascript
复制
char* writeSpace(int i)
{
    char *ret = NULL;
    asprintf(ret, "                              " + (30-i));
    return ret;
}

当然,这需要你free内存(否则你会有一个内存泄漏)。你可以这样做:

代码语言:javascript
复制
char *spaces = writeSpace(10);
printf("%s%i", spaces, 42);
free(spaces);

另一种方法是使用函数在下一次调用时自行清除的静态变量:

代码语言:javascript
复制
char* writeSpace(int i)
{
    static char *ret = NULL;
    if (ret != NULL) free(ret);
    asprintf(ret, "                              " + (30-i));
    return ret;
}

但这有一个缺点,即您只能在printf参数中使用一次对writeSpace的调用,因为第二次调用将清除前一次调用的内存。仍然可能是你想要的。

顺便说一句,+ (30-i)部分是邪恶的。相反,您可能需要的是:

代码语言:javascript
复制
asprintf(ret, "%*s", i, ""); // Prints i spaces
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6640975

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档