使用指针传递数组值

时间:2017-06-17 17:30:59

标签: c++ arrays

我有两个函数,一个用于文件读取,另一个用于少量数字排序。使用函数read()我正在读取文件的每一行并将每行放入数组中。文件看起来像:

1
2
3

使用函数sort()我只想打印值大于1的数字。

有什么问题:我打印了两个数组,但我的排序数组仍然打印所有值,不仅大于1.

我的代码:

    #include <iostream>
    #include <fstream>
    #include <string>
    #include <cstdlib>

    using namespace std;

    class UZD
    {
     private:
    int numLines;
    int *value;
    public:
        UZD();
        int * read();
        int sort();
    }; 
   // ========================================================= 
     UZD::UZD() 
    {
    }
    // ========================================================= 
    int * UZD::read(){  
    ifstream myfile("stu.txt");
    int value[20];
    string line[20]; 
    int i=0;
    while(!myfile.eof() && i < 20) {
      getline(myfile,line[i]); 
      ++i;
            }
     numLines = i;
    for (i=0; i < numLines; ++i) {
        value[i] = atoi(line[i].c_str());
      cout << i << ". " << value[i]<<'\n'; 
            }
    return value;
    }
    // ========================================================= 
    int UZD::sort(){
    int *p;
    p = read();
    int i;
    if(p[i] > 1) {
      cout << p <<'\n'; 
       }
    }
    // ========================================================= 
    int main() {
    UZD wow;
    wow.read();
    wow.sort();
    }

3 个答案:

答案 0 :(得分:0)

您的代码中存在许多问题,最明显的问题是read()方法中的“返回值”。值是一个本地数组,将在read()范围之外消失。设计也似乎有缺陷。您正在调用read()两次,一次来自main(),另一次来自sort()。 我用矢量编写了一个工作代码。可能这正是你所期待的:

#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
#include <vector>

using namespace std;

class UZD
{
        private:
                int numLines;
                vector<int> value;
        public:
                UZD();
                vector<int> & read();
                void sort();
};
// =========================================================
UZD::UZD()
{
}
// =========================================================
vector<int> & UZD::read(){
        ifstream myfile("stu.txt");
        vector<string> line(20);
        int i=0;
        while(!myfile.eof() && i < 20) {
                getline(myfile,line[i]);
                ++i;
        }
        numLines = i;
        cout << "After reading file: " << endl;
        for (i=0; i < numLines; ++i) {
                value.push_back(atoi(line[i].c_str()));
                cout << i << ". " << value[i]<<'\n';
        }
        return value;
}
// =========================================================
void UZD::sort(){
        cout << "Inside sort()" << endl;
        for(int i=0; i<value.size(); ++i){
                if(value[i] > 1)
                        cout << value[i] << endl;
        }
}
// =========================================================
int main() {
        UZD wow;
        wow.read();
        wow.sort();
        return 0;
}
为了清楚起见,我保留了变量名称相同的名称。如果你什么都没得到,请告诉我。

答案 1 :(得分:0)

您的计划中存在很多问题;仅举几例: 在sort中,您使用变量i未初始化,这是未定义的行为(可能崩溃);您编写while(!myfile.eof()...,这通常被认为是错误的see this SO answer;建议不要使用atoi,因为如果参数不表示数字则不安全;您返回指针到一个局部变量,它被破坏了一个超出范围;你声明成员变量,但通过本地变量(例如值)......

请参阅以下代码,该代码演示了int*vector<int>的用法;希望它有所帮助。

class UZD
{
private:
    int numLines;
    int *value = nullptr;
public:
    ~UZD() {
        if (value)
            delete value;
    };
    void read();
    void print();
};

// =========================================================
void UZD::read(){
    ifstream myfile("stu.txt");
    value = new int[20];
    int val;
    numLines = 0;
    while(numLines < 20 && myfile >> val) {
        value[numLines] = val;
        numLines++;
    }
}
// =========================================================
void UZD::print(){
    for (int i=0; i<numLines; i++)
        cout << value[i] << endl;
}


class UZD_vector
{
private:
    vector<int> values;
public:
    void read();
    void print();
};

// =========================================================
void UZD_vector::read(){
    ifstream myfile("stu.txt");
    int val;
    while(myfile >> val) {
        values.push_back(val);
    }
}
// =========================================================
void UZD_vector::print(){
    for (auto val : values)
        cout << val << endl;
}

// ============================================= ============ int main(){

cout << "with int[]:" << endl;
UZD wow;
wow.read();
wow.print();

cout << "with vector:" << endl;
UZD wow_vector;
wow_vector.read();
wow_vector.print();

}

答案 2 :(得分:0)

这是你自己的代码纠正,以防你发现矢量太难学习(但不应该是真的)

#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>

using namespace std;

class UZD
{
        private:
                int numLines;
                int *value;
                int num;
        public:
                UZD();
                void read();
                void sort();
};
// =========================================================
UZD::UZD():num(20)
{}
// =========================================================
void UZD::read(){
        ifstream myfile("stu.txt");
        value = new int[num];
        string line[num];
        int i=0;
        while(!myfile.eof() && i < num) {
                getline(myfile,line[i]);
                ++i;
        }
        numLines = i;
        for (i=0; i < numLines; ++i) {
                value[i] = atoi(line[i].c_str());
                cout << i << ". " << value[i]<<'\n';
        }
}
// =========================================================
void UZD::sort(){
        cout << "After sorting: " << endl;
        for (int i = 0; i < num; ++i) {
                if(value[i] > 1)
                        cout << value[i] << endl;
        }
}
// =========================================================
int main() {
        UZD wow;
        wow.read();
        wow.sort();
        return 0;
}