C ++数组中的Gettin Lvalue错误

时间:2014-02-28 15:27:02

标签: c++ turbo-c++

我需要对学生的名字和姓氏进行排序,然后使用C ++中的结构在屏幕上显示完全排序的名称。我试过但编译器显示Lvalue Required错误 - 在这些行中

tfname = s[i].fname;
s[i].fname = s[j].fname;
s[j].fname = tfname;
tlname = s[i].lname;
s[i].lname = s[j].lname;
s[j].lname = tlname;

这里是完整的代码

#include <iostream.h>
#include <conio.h>
#include <stdio.h>
#include <string.h>
struct student
{
    char fname[20];
    char lname[20];
    int id_no;
};
typedef student S;
void main()
{
    S s[25];
    char tfname[20], tlname[20];
    int t;
    for(int i = 0; i<25; i++)
    {
        cout<<"\n Enter Student's first name:";
        cin>>s[i].fname;
        cout<<"\n Enter Student's last name:";
        cin>>s[i].lname;
        cout<<"\n Enter ID NO";
        cin>>s[i].id_no;
    }
    for(i = 0; i<24; i++)
    {
        for(int j = i+1; j<25; j++)
        {
            if(strcmp(s[i].fname, s[j].fname)>0)
            {
                tfname = s[i].fname;
                s[i].fname = s[j].fname;
                s[j].fname = tfname;
                tlname = s[i].lname;
                s[i].lname = s[j].lname;
                s[j].lname = tlname;
                t = s[i].id_no;
                s[i].id_no = s[j].id_no;
                s[j].id_no = t;
            }
            else
            { 
                if(strcmp(s[i].fname, s[j].fname)==0)
                { 
                        if(strcmp(s[i].lname, s[j].lname)>0)       
                     {
                        tfname = s[i].fname;
                        s[i].fname = s[j].fname;
                                s[j].fname = tfname;
                        tlname = s[i].lname;
                                s[i].lname = s[j].lname;
                                s[j].lname = tlname;
                                t = s[i].id_no;
                                s[i].id_no = s[j].id_no;
                                s[j].id_no = t;
                            }
                }
            }
        }
        cout<<"\n\n FIRST NAME \t LASTNAME \t ID NO ";
        for(int i = 0; i<25; i++)
        {
            cout<<"\n"<< c[i].fname<<"\t" <lt; c[i].lname <<="" <
        }
        getch();
    }
}

请帮助我如何解决此错误

4 个答案:

答案 0 :(得分:1)

使用std::vectorstd::string代替数组。数组在诸如你的用例中有各种各样的问题。如果你不能像“正常”物体那样传递或返回它们,那么它们的一大问题是类型intdouble。他们在C ++语言中的“二等公民”地位也会导致你在程序中观察到的奇怪行为。

int GetInt() // works fine
{
    return 123; 
}

void DoSomethingWithDouble(double d) // works fine
{
    // ...
}

char[] GetArray() // does not even compile
{
    // ...
}

void DoSomethingWithArray(int array[]) // does not work as expected, either
{
    // ...
}

这就是为什么在C ++中,我们使用std::stringstd::vector或其他复杂的类,它们允许我们完全(或几乎完全)像简单(所谓的“原始”)一样对待字符串或集合intdouble

等类型
std::string GetString()
{
    // ...
}

void DoSomethingWithString(std::string const &s) // you should use const & here because
                                                 // it does not cost you anything and may
                                                 // increase speed of your program
{
    // ...
}

std::vector<int> GetInts()
{
    // ...
}

void DoSomethingWithInts(std::vector<int> const &v) // you should use const & here because
                                                    // it does not cost you anything and 
                                                    // may increase speed of your program
{
    // ...
}

您甚至可以完全安全地分配它们,而无需特殊语法:

std::vector<int> v1;
std::vector<int> v2;
v1 = v2;

std::string s1;
std::string s2;
s1 = s2;

您可以创建字符串向量,它们的行为与您期望的完全相同:

std::vector<std::string> string_vector;
string_vector.push_back("abc");
string_vector[0][0] = 'A';
std::cout << string_vector[0]; // prints "Abc"

Arrays确实在C ++中占有一席之地,但不适合初学者,也不适合高级编程。

答案 1 :(得分:0)

你不能用这种方式交换字符串。应使用strcpy()复制字符串。

strcpy(tfname, s[i].fname);
strcpy(s[i].fname, s[j].fname);
strcpy(s[j].fname, tfname);

另一种方式是#include <string>,并将student::fnamestudent::lnametfnametlname声明为std::string。然后你可以使用赋值运算符来正确复制它们。

答案 2 :(得分:0)

Arrays没有赋值运算符。而不是它,你必须将元素从一个数组复制到另一个数组。在您的代码数组中,类型为char并设计用于存储字符串,您应该使用标题std::strcpy中声明的标准C函数<cstring>

所以这段代码片段

tfname = s[i].fname;
s[i].fname = s[j].fname;
s[j].fname = tfname;
tlname = s[i].lname;
s[i].lname = s[j].lname;
s[j].lname = tlname;

将采用以下方式

std::strcpy( tfname, s[i].fname );
std::strcpy( s[i].fname,s[j].fname );
std::strcpy( s[j].fname, tfname );
std::strcpy( tlname, s[i].lname );
std::strcpy( s[i].lname, s[j].lname );
std::strcpy( s[j].lname, tlname );

另一种方法是使用标准类std :: array。在这种情况下,您可以使用赋值运算符。例如

#include <array>
//...
struct student
{

    std::array<char, 20> fname;
    std::array<char, 20> lname;
    int id_no;
};

最后你可以使用类std::string而不是原始字符数组。

答案 3 :(得分:0)

如果您的任务说明包含 C ++ structsort,那么这个版本呢?

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

struct Student
{
    std::string fname;
    std::string lname;
    int id_no;
};

/// checks order after comparing (fname, then lname) 
/// (usable with std::sort)
bool operator<(const Student& lhs, const Student& rhs)
{
    int c=lhs.fname.compare(rhs.fname);
    if (c < 0) {
        return true;
    } else if (c > 0) {
        return false;
    }
    return lhs.lname < rhs.lname;
}

/// write student to standard output stream
/// (usable with std::for_each)
void out_student(const Student& s)
{
    std::cout << s.fname << " " << s.lname << " " << s.id_no << std::endl;
}


int main() 
{
    std::list<Student> students;

    // entering students left out

    std::sort(students.begin(), students.end());
    std::for_each(students.begin(), students.end(), out_student);
    return 0;
}