DEV c++报错不知道错哪

c++编译器报错[Error] conversion from 'std::string* {aka std::basic_string*}' to non-scalar type 'std::string {aka std::basic_string}' requested

#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
    int n;
    cin>>n;
    double s[n];
    string m[n];
    for(int i=0; i<n; i++)
    {
        cin>>m[i]>>s[i];
    }
    for(int i=0; i<n-1; i++)
    {
        double k=i;
        for(int j=i+1; j<n; j++)
        {
            if(m[j]=="male"&&m[k]=="male")
            {
                if(s[j]<s[k])
                {
                    k=j;
                }
            }
            else if(m[j]=="male"&&m[k]=="female")
            {
                k=j;
            }
            else if(m[j]=="female"&&m[k]=="female")
            {
                if(s[j]>s[k])
                {
                    k=j;
                }
            }
        }
        if(k!=i)
        {
            swap(s[k],s[i]);
            swap(m[k],m[i])
        }
    }
    for(int i=0; i<n; i++)
    {
        cout<<fixed<<setprecision(2)<<s[i];
    }
    return 0;
} 

8、9行声明数组个数不可以使用变量,可以考虑用动态分配

目前您使用的C++版本不能用变量开数组,如果题中给了 n ≤ 1000,那您可以开

double s[1010];// 比 n 的最大值多开 10,防止数组越界
string m[1010];

【以下回答由 GPT 生成】

这个错误是由于代码中的string m[n]这一行出现的问题。

在C++中,数组的大小是在编译时期确定的,而不是运行时期确定的。而在标准的C++中,不允许使用变量来定义数组的大小。然而,一些编译器可能支持这个功能,但是可能会导致一些编译时错误。

在你的代码中,你使用了一个变量n来定义数组string m[n]的大小。这可能是导致编译错误的原因。

要解决这个问题,你可以使用动态内存分配来替代数组的定义。具体步骤如下:

  1. string m[n];改为string* m = new string[n];。这样就使用new运算符在堆上分配了一个n个元素的string数组。
  2. 注意,在程序结束时,需要使用delete[]运算符来释放内存,防止内存泄漏。所以在return 0;之前添加delete[] m;

下面是修改后的代码:

#include<iostream>
#include<iomanip>
using namespace std;

int main()
{
    int n;
    cin >> n;
    double s[n];
    string* m = new string[n]; // 使用动态内存分配
    for(int i=0; i<n; i++)
    {
        cin >> m[i] >> s[i];
    }
    for(int i=0; i<n-1; i++)
    {
        double k=i;
        for(int j=i+1; j<n; j++)
        {
            if(m[j]=="male" && m[k]=="male")
            {
                if(s[j]<s[k])
                {
                    k=j;
                }
            }
            else if(m[j]=="male" && m[k]=="female")
            {
                k=j;
            }
            else if(m[j]=="female" && m[k]=="female")
            {
                if(s[j]>s[k])
                {
                    k=j;
                }
            }
        }
        if(k!=i)
        {
            swap(s[k],s[i]);
            swap(m[k],m[i]);
        }
    }
    for(int i=0; i<n; i++)
    {
        cout << fixed << setprecision(2) << s[i] << " "; // 添加空格,便于输出
    }
    delete[] m; // 释放内存
    return 0;
}

这样,你应该就可以解决这个编译错误了。希望对你有帮助!如果还有其他问题,请随时提问。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^