我正在创建一个简单的控制台应用程序,它具有一个带有两个数组的函数,一个具有一系列列宽,另一个具有一系列字符串,而cout的每个字符串然后添加空格直到它到达下一列。
我收到此错误:error: expected primary-expression before 'int'
位于columnizer
函数的第一行。我已经尝试在头文件和cpp文件中更改声明但没有成功。
以下是相关代码:
//cashier.cpp
void columnizer(int sizes[], std::string values[]){
int columnCount = (sizeof sizes) / (sizeof int);
for (int i=0; i < columnCount; i++){
string value = values[i];
cout << value;
char valueLength = sizeof value / sizeof char
char extraSpace = columnSizes[i] - valueLength;
while (extraSpace > 0){
cout << " ";
extraSpace--;
}
}
}
对columnizer的调用:
//cashier.cpp
int columnSizes[5] = {7, 15, 20, 9, 9};
string headers[5] = {"Qty","ISBN","Title","Price","Total"};
...
columnizer(columnSizes, headers);
...
标题文件:
//cashier.h
int cashier();
void columnizer(int sizes[], std::string values[]);
答案 0 :(得分:1)
这段代码充满了问题:
std::string s
的长度是使用s.size()
确定的这是一种如何修补代码并避免明显问题的方法:
template <int N>
void columnizer(int (&sizes)[N], std::string (&values)[5]){
for (int i=0; i < N; i++){
std::string const& value = values[i];
std::cout << value;
char valueLength = value.size();
char extraSpace = sizes[i] - valueLength;
while (extraSpace > 0){
std::cout << " ";
extraSpace--;
}
}
}
关键的魔力是可以传递对数组的引用。更有趣的是,您可以通过引用传递它们,使编译器推导数组的大小,即sizeof
- hack需要 no 。为了使交易更加甜蜜,编译器将验证传递的数组是否相同。
您似乎确实想要打印列标题,但您的代码实际上并不打印列名称。请注意,不需要手动填充。相反,您可以根据需要将流设置为使用空格填充,例如
std::cout << ' ' << std::setw(sizes[i]) << values[i];
您可以使用操纵器std::left
和std::right
将输出放在任何填充的左侧或右侧(您还可以使用std::internal
将流填充在值内,例如在标志和价值之间)。