Сравнение char в C++

Это мой текстовый файл, из которого я беру данные

10
wood      8
gold      7
silver    5
gold      9
wood      1
silver    1
silver    9
wood      3
gold      5
wood      7

Я должен найти товары с тем же именем и добавить все их количества, поэтому конечный результат должен быть wood=19; gold=21; silver=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"

4 ответов


в 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

Ok, gcc знает, чтобы принять его, но массивы переменной длины не поддерживаются в C++, поэтому эта строка:

char name[10][n]; // 10 symbols are given for items name

не соответствует и должен был дать хотя бы предупреждение.

способ C++ для работы с массивом, размерность которого известна только во время выполнения, - использовать std::vector.

но ваша реальная проблема заключается в том, что ни необработанный массив char, а не указатель на char иметь два == оператор (это невозможно для массивов или указателей), поэтому в вашем name[i]==name[d] вы фактически сравниваете адреса, потому что массивы распадаются на указатели на их первый элемент при использовании в выражениях. Таким образом, ваш тест такой же, как if (&name[i][0] == &name[d][0) и не может дать ожидаемого результата.

можно использовать strcmp для сравнения нулевых завершенных массивов символов (также известных как строки C) или лучше использовать std::string который имеет overidden == оператора.


оператор char []==, который вы используете, сравнивает значения указателей, а не значения сравнения строк. т. е. вы сравниваете положение первых символов в памяти.

в качестве примечания, имя char[10] [n]; недопустимо; так как это n должно быть константой времени компиляции. Я бы предложил std:: vector в качестве замены.


Если вы просто хотите добавить номер, то вы можете использовать unordered_map. Он похож на хэш-таблицу в java.