这是我从
获取数据的文本文件10
wood 8
gold 7
silver 5
gold 9
wood 1
silver 1
silver 9
wood 3
gold 5
wood 7
我应该找到同名商品并加上所有金额,所以最终结果应该是木材= 19;金= 21;银= 15。这就是我到目前为止所做的事情
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
ifstream read("data.txt");
int n;
read >> n;
char name[10][n]; // 10 symbols are given for items name
int amount[n];
for(int i=0; i<n; i++)
{
read.ignore(80, '\n');
read.get(name[i], 10);
read >> amount[i];
}
for(int i=0; i<n; i++)
{
for(int d=1; d<n; d++)
{
if(name[i]==name[d] && i!=d)
{
}
}
}
return 1;
}
到目前为止的问题是,name[i]==name[d]
甚至没有做出反应,例如name[i]="wood"
和name[d]="wood"
答案 0 :(得分:6)
在C ++中,我们倾向于使用std::string
而不是char[]
。第一个是等于运算符重载,因此你的代码应该工作。对于后者,您需要strcmp()
才能实现目标。
现在你的代码可能会这样(我使用了std :: vector,但是你可以使用一个字符串数组,但我不推荐它):
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;
int main()
{
ifstream infile("data.txt");
int n;
infile >> n;
vector<string> name(n);
int amount[n], i = 0;
while (infile >> name[i] >> amount[i])
{
cout << name[i] << " " << amount[i] << endl;
i++;
}
// do your logic
return 0;
}
顺便说一下,您可以使用std::pair
来使您的代码更具可读性,其中第一个成员是名称,第二个成员是数量。
与您的问题无关,main()
在一切正常时往往return 0;
,而您返回1.
PS:这是一个有效的例子:
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <utility>
using namespace std;
int main()
{
ifstream infile("data.txt");
int n;
infile >> n;
vector<string> name(n);
int amount[n], i = 0;
while (infile >> name[i] >> amount[i])
{
// cout << name[i] << " " << amount[i] << endl;
i++;
}
vector< pair<string, int> > result;
bool found;
for(int i = 0; i < name.size(); ++i)
{
found = false;
for(int j = 0; j < result.size(); ++j)
{
if(name[i] == result[j].first)
{
result[j].second += amount[i];
found = true;
}
}
if(!found)
{
result.push_back({name[i], amount[i]});
}
}
cout << "RESULTS:\n";
for(int i = 0; i < result.size(); ++i)
cout << result[i].first << " " << result[i].second << endl;
return 0;
}
输出:
Georgioss-MacBook-Pro:~ gsamaras$ g++ -Wall -std=c++0x main.cpp
Georgioss-MacBook-Pro:~ gsamaras$ ./a.out
RESULTS:
wood 19
gold 21
silver 15
答案 1 :(得分:1)
好的,gcc知道接受它,但C ++不支持可变长度数组,所以这一行:
char name[10][n]; // 10 symbols are given for items name
不符合要求,至少应该发出警告。
处理其维度仅在运行时已知的数组的C ++方法是使用std::vector
。
但你真正的问题是,原始字符数组和指向char的指针都没有覆盖==
运算符(数组或指针不可能),所以在你的name[i]==name[d]
中你实际上是比较地址,因为当在表达式中使用时,数组会衰减到指向第一个元素的指针。因此,您的测试与if (&name[i][0] == &name[d][0)
相同,无法给出预期的结果。
您可以使用strcmp
来比较空终止的char数组(也称为C字符串),或者更好地使用具有重叠std::string
运算符的==
。
答案 2 :(得分:0)
您正在使用的char [] ==运算符是比较指针值,而不是字符串比较值。即你要比较内存中第一个字符的位置。
作为旁注,char name [10] [n];是无效的;因为n必须是编译时常量。我建议将std :: vector作为替代品。
答案 3 :(得分:0)
如果您只想添加号码,则可以使用unordered_map。它类似于java中的哈希表。