我得到了如下代码:
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);我的输出应该类似于:
#1 key: foo value: bar value2: foobar但事实并非如此。它看起来像:
#1 key: foo(null)value: bar(null)value2: foobar(null)我的代码出了什么问题?
发布于 2011-07-10 20:11:26
好的,您正在将所有这些空格fput到控制台,所以您首先获得它们。
然后你会输出所有其他的东西,所以下一步你会得到它。
也许您的意思是让writeSpace返回一个C样式的字符串,而不是将其打印到控制台。
但是一定要为它分配空间!由于内存缓冲区的所有权变得有点麻烦,所以最好在函数之外分配空间。
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++功能。这会容易得多:
std::cout << "#" << id << " "
<< " key: " << std::setw(30) << key
<< " value: " << std::setw(30) << value
<< " value2: " << value2;我推荐用these resources来学习惯用的C++。
发布于 2011-07-10 20:06:34
您已经声明writeSpace()返回一个char*,但是您没有从中返回任何内容。
发布于 2011-07-10 20:29:35
您的writeSpace函数不会返回新的字符串(尽管您已经这样声明了),而是直接写入终端。因为您在printf调用中将其作为参数调用,所以writeSpace首先被调用,打印它的内容,然后printf打印它的内容。你应该这样做:
char* writeSpace(int i)
{
char *ret = NULL;
asprintf(ret, " " + (30-i));
return ret;
}当然,这需要你free内存(否则你会有一个内存泄漏)。你可以这样做:
char *spaces = writeSpace(10);
printf("%s%i", spaces, 42);
free(spaces);另一种方法是使用函数在下一次调用时自行清除的静态变量:
char* writeSpace(int i)
{
static char *ret = NULL;
if (ret != NULL) free(ret);
asprintf(ret, " " + (30-i));
return ret;
}但这有一个缺点,即您只能在printf参数中使用一次对writeSpace的调用,因为第二次调用将清除前一次调用的内存。仍然可能是你想要的。
顺便说一句,+ (30-i)部分是邪恶的。相反,您可能需要的是:
asprintf(ret, "%*s", i, ""); // Prints i spaceshttps://stackoverflow.com/questions/6640975
复制相似问题