【问题标题】:Why are pointers used for std::string.find?为什么指针用于 std::string.find?
【发布时间】:2013-08-17 16:39:40
【问题描述】:

本来我是用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++; 
        }
    }
}

【问题讨论】:

  • 其实不需要看代码很详细.......从ifstream读取一个文件......有一个名称[100]的数组...... ....cin >> 给出 NAME,然后使用 ;;find 搜索 name[100] 如果 NAME 之前存在
  • +1 “但编译器说不”可能是我听说过的关于编译器错误的 BEST 事情。我的意思是,编译器对我们的代码变得更加自我意识,所以它看到了代码并且不想修复它,所以它只是说不。运行gcc main.c。输出GCC 4.8.1: No
  • 您的 while 循环不会像您希望的那样工作。 load.eof() 直到 您尝试从中读取并且由于到达文件末尾而读取失败后才会返回 true。您的循环条件应该是读取是否成功(如while(load &gt;&gt; whatever) {...})。此外,给变量全大写名称(用于宏)也是不好的风格,并且有两个名称除了大小写相同的变量也是非常不好的风格。
  • 当我使用 while( load>> wtever ){ ....} 时,函数 name->find(NAME) 不再像以前那样起作用....所以,我有两个问题。 ....(1)为什么如果按上述使用它可以运行(忽略eof的失败)??............(2)为什么当我转到while时它可以运行(加载>> wtever){.......} ??????

标签: c++ arrays string pointers


【解决方案1】:

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

n = name->find(NAME);

相当于:

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

所以你可以看到这个值是一个指针,需要用-&gt;而不是.来操作。如果有帮助,a-&gt;b 等同于 (*a).b

我认为你的代码有问题;你真的确定这就是你想要的工作方式吗?

【讨论】:

  • 是这样的吗。我们调用一个数组并使用 & 使其通过引用传递为可修改............ * 是什么意思是指针,指针的地址在哪里??? ......顺便说一句,thxxxx 的评论
【解决方案2】:

这一行的事实:

n = name->find(NAME);

是它没有按照你的想法做。在这里,您在std::string 上使用std::find 方法。数组的第一个元素。不是数组本身。另外,这行代码没有什么区别:

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

【讨论】:

  • 一件小事:普通数组也可以与 std::find 一起使用。因此,vector 提供对迭代器方法的访问是不正确的(表明数组没有)。
【解决方案3】:

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

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

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

但切换到std::vector&lt;std::string&gt; 可能会更好。

【讨论】:

  • 所以你的意思是 name[100] 变成了一个指针,调用第一个字符串并像链接列表一样做某事? thxxx 的评论.....我只是一个编码的初学者,很抱歉问这样一个白痴问题......
  • 在 C++ 中,表的名称也是指向它的第一个元素的指针。所以什么都没有改变,你只是不小心使用语言的这个特性访问了第一个元素。
猜你喜欢
  • 2015-12-15
  • 1970-01-01
  • 2021-11-29
  • 2014-06-05
  • 1970-01-01
  • 1970-01-01
  • 2011-02-15
相关资源
最近更新 更多