3

もともと、私はstring_array.find(item)検索していましたが、コンパイラはノーと言っていました。

string_array->find(item)次に、ポインタを使用して問題を解決できるかどうかを検索しましたが、説明はありません。

これが私のコードです:

#include<iostream>
#include<string>
using namespace std;
string name [100];
int Jan[100]={0}, Feb[100]={0}, Mar[100]={0}, Apr[100]={0}, May[100] = 0, Jun[100]={0},Jul[100]={0}, Aug[100]={0},Sep[100]={0},Oct[100]={0},Nov[100]={0},Dec[100]={0};
int earning [100];
int main () {
    ifstream load;
    load.open("record.txt");
    if(load.fail()){
        cout << "error in loading data" << endl;
        exit(1);
    } 
    else {
int i = 0;
    string NAME;
    int EARNING;
    int MONTH;
    int dump1;
    char dump2;
    while ( load.eof() != 1 ) {
        int n = 0;
        load >> NAME >> EARNING >> dump1 >> dump2 >> MONTH >> dump2 >> dump1 ;
        n = name->find(NAME);
        if ( n < 0 ) {
            n = i ;
        } 
        else {
    i = i - 1 ;
        }
        name[n] = NAME;
        if ( MONTH == 1) { Jan[n] += EARNING ;}
        if ( MONTH == 2) { Feb[n] += EARNING ;}
        if ( MONTH == 3) { Mar[n] += EARNING ;}
        if ( MONTH == 5) { Apr[n] += EARNING ;}
        if ( MONTH == 5) { May[n] += EARNING ;}
        if ( MONTH == 6) { Jun[n] += EARNING ;}
        if ( MONTH == 7) { Jul[n] += EARNING ;}
        if ( MONTH == 8) { Aug[n] += EARNING ;}
        if ( MONTH == 9) { Sep[n] += EARNING ;}
        if ( MONTH == 10) { Oct[n] += EARNING ;}
        if ( MONTH == 11) { Nov[n] += EARNING ;}
        if ( MONTH == 12) { Dec[n] += EARNING ;}
        i++; 
        }
    }
}
4

3 に答える 3

5

name100 個の文字列の配列です。あなたのように配列名を単独で使用すると、最初の要素へのポインタに崩壊します。あなたのコード:

n = name->find(NAME);

以下と同等です。

n = (&name[0])->find(NAME);

->したがって、その値がポインターであり、ではなく で操作する必要があることがわかります.。それが役立つ場合は、a->bと同等(*a).bです。

あなたのコードにはバグがあると思います。それがあなたがそれをどのように機能させたいか本当に確信していますか?

于 2013-08-17T16:50:32.133 に答える
5

この行の事実:

n = name->find(NAME);

それはあなたが思っていることをしていないということです。ここでは、 でstd::findメソッドを使用していstd::stringます。配列の最初の要素。配列自体ではありません。さらに、このコード行は次のものと同じです。

n = (*name).find(NAME);

したがって、NAME文字列配列の最初の要素に が存在する場合、コードは検索しています。配列全体を検索するには、std::vector. 標準の反復子メソッドにアクセスできます。

#include <vector>

std::vector<std::string> name(100);
// ...
it = find(name.begin(), name.end(), NAME);
// std::find return an iterator
if (it == name.end())
    // NOT FOUND
else
    // FOUND
于 2013-08-17T16:54:40.547 に答える
1

コンパイルされるという事実は偶然です。配列の最初の文字列で find を呼び出すだけです。配列内の文字列を見つけたいと思うので、std::findのようなものを使用する必要があります。

string *begin = name;
string *end = begin + 100;

if (end == std::find(begin, end, NAME))
{
  // not found
}

しかし、おそらく に切り替えた方がよいでしょうstd::vector<std::string>

于 2013-08-17T16:56:08.093 に答える