【发布时间】:2017-07-29 02:26:28
【问题描述】:
我现在是一名计算机科学专业的学生,今天收到了一个非常普通的作业,应该是用 C++ 编写的。直到今天我一直在学习全 C。这更像是一个盲目的任务。
在 C 中,我通常使用这个:
printf("\n\n\t%-30s %-7d liters\n\t%-30s %-7d liters\n\t%-30s %-7d km",
"Current gasoline in reserve:",
db.currentGas,
"Total gasoline used:",
db.usedGas,
"Total travel distance:",
db.usedGas);
由于作业的条件是它应该用 C++ 编写,这就是我尝试过的:
cout << setw(30) << "\n\n\tCurrent gasoline in reserve: "
<< setw(7) << db.currentGas << "litres"
<< setw(30) << "\n\tTotal gasoline used: "
<< setw(7) << db.usedGas << "litres"
<< setw(30) << "\n\tTotal travel distance: "
<< setw(7) << db.travelDistance << "km";
但看起来 C 的 %-30s 和 C++ 的 setw(30) 之间存在差异?
【问题讨论】:
-
我永远不会理解人们对一个完全有效的问题投反对票,包括已经尝试过的代码以及具体提出的问题。可能是巨魔?
-
实际上,在 C++ 中使用 printf 也是绝对合法的……不过,你宁愿使用
#include <cstdio>而不是#include <stdio.h>。我个人经常使用 printf(有时是 (s)scanf)函数,因为它比 C++ 流更方便。另一方面,如果涉及复杂的类或您不希望在所涉及的所有平台上都相同的类型定义(例如uint32_t...),则后者会非常方便。因此,如果分配只需要 C++,您可以保留对 printf 的调用 - 如果要求明确使用流,那么您需要更改... -
@Aconcagua:避免 printf() / scanf() 系列函数仍然是一种很好的做法,因为它们允许出现各种潜在的致命错误(由于是可变参数函数,即没有类型检查)。另外,即使在 C 语言中,我也会远离任何 scanf() —— 它唯一略微比使用 get() 更容易获得 scanf() 调用...
-
@DevSolar 真相,scanf 我通常不使用 - 更喜欢一次读取整行(fgets)并使用 sscanf之后 - 如果 我愿意...不要误会我的意思,我非常欣赏 C++ 流。但有时,好的旧 printf 系列比流更方便,比较
fprintf(stderr, "[...] failed with error %d (%s)\n", errno, strerror(errno));和std::cerr << "[...] failed with error " << errno << " (" << strerror(errno) << ')' << std::endl;。如果有代码已经正常工作,我会坚持下去,遵循永不接触正在运行的系统的准则.. -
@Aconcagua:同意,如果它在那里并且经过测试,请不要触摸它。但我会尽量避免在 new 代码中使用此类结构。
标签: c++ c io formatting iomanip