为什么指针用于std :: string.find?

时间:2013-08-17 16:39:40

标签: c++ arrays string pointers

最初,我使用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++; 
        }
    }
}

3 个答案:

答案 0 :(得分:5)

name是一个包含100个字符串的数组。如果您像自己一样使用数组名称,它会衰减为指向其第一个元素的指针。你的代码:

n = name->find(NAME);

相当于:

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

因此,您可以看到该值是如何指针,需要使用->而不是.进行操作。如果有帮助,a->b相当于(*a).b

我认为你的代码有问题;你真的确定你希望它如何运作吗?

答案 1 :(得分:5)

这一行的事实:

n = name->find(NAME);

是它没有按你的想法行事。您在std::find上使用std::string方法。数组的第一个元素。不是数组本身。此外,这行代码与:

没有区别
n = (*name).find(NAME);

因此,您的代码正在搜索字符串数组的第一个元素中是否存在NAME。要搜索整个数组,我建议您使用std::vector。它使您可以访问标准的iterator方法:

#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

答案 2 :(得分:1)

它编译的事实是巧合 - 它只是调用数组中第一个字符串的find。我想你想在数组中找到字符串,所以你应该使用类似std::find的东西:

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

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

但切换到std::vector<std::string>可能会更好。