2013-05-03 63 views
0

我一直在做这个程序一段时间,但它拒绝合作这最后一点点。程序的重点在于将数据文件筛选到三个数组中,对数组进行排序,然后将其打印到表中。我遇到的问题似乎与表格一致。该程序分为四个函数,当我尝试调试时,它不会在函数中显示productName数组。程序不会打印字符串数组C++

代码的故障段看起来是这样的:

void printReport (string productName[], int numberinStock[], float price[], int number_of_products) 
{ 
    float totalPrice; 

    cout << setw(18) << " " << "Friendly Grocer Store Inventory" << setw(17) << " " << endl; 
    cout << setw(18) << "Inventory Item" << setw(16) << "Number in Stock" << setw(16) << "Unit Price" << setw(16) << "Total Sales" << endl; 
    for (int count=0; count <number_of_products-1; count++) 
    { 
     cout << setw(18) << productName[count] << setw(16) << numberinStock[count] << setw(16) << std::setprecision(2) << price[count] << setw(16) << std::fixed << std::setprecision(2) << price[count]*numberinStock[count] << endl; 
    } 
    cout << "Total Price: " << totalPrice; 
} 

它将打印一切,但不是productName。 for循环之外的某些调试语句(如cout << productName[1])将打印出适当的productName,但它在实际报告中完全空白。 经过一些调试后,似乎在for循环中输出productName后,每个项目都会覆盖产品名称。

例如刚刚离开cout << setw(18) << productName[count] << setw(16) << numberinStock[count] << endl;

会产生

“3S”
“10H”
“2A”

的产品名称有芒果,三明治,和比萨。

我不知所措。我在哪里搞砸了?

+0

疯狂的猜测:所有'productName's以''\ r''结尾? – 2013-05-03 02:18:22

+0

没有。它们都存储在一个.dat文件中,就像常用的家用名称一样。 (就像现在的芒果,三明治和披萨一样)。另外,我发现把一个endl;在productName之后,然后让第二行的其余信息对主要有帮助。我介绍setw的那一刻,它有点覆盖了productName。 – user2345261 2013-05-03 02:24:50

+1

“endl”有助于暗示你确实在你的字符串中有“\ r''s。什么平台a)你在运行,和b)是创建的文件? [如果该文件是在Windows上创建的,并且您正在运行某些* nixish,那么当'dos2unix'被遗忘时这很自然;如果你在Windows上运行,你是以文本还是二进制打开文件?] – 2013-05-03 02:30:26

回答

0

你可能已经搞砸了将数据传递给函数。如果在函数中设置测试数组,它应该正确打印。

pass arrays in C++使用数组名称。 例如

int main() 
{ 
    string productName[] = {"mango"}; 
    ... 
    printReport(productName, numofProduct); 
    return 0; 
} 
+0

这些数组似乎正在被正确传递,并且它们的传递方式与它们在程序中的其他四个函数中的传递方式相同似乎运行良好)。 – user2345261 2013-05-03 02:55:14

+0

@ user2345261正在猜测。垃圾输出通常是由读取错误的内存引起的,例如'productName [number_of_products]'或忘记初始化内存,例如'int num = 0;'。 – mikek3332002 2013-05-06 23:20:23