指向结构数组的指针仅显示 char 字段的第一个字符

Posted

技术标签:

【中文标题】指向结构数组的指针仅显示 char 字段的第一个字符【英文标题】:Pointer to structure array shows only the first character of a char field 【发布时间】:2020-07-16 07:55:48 【问题描述】:

我有以下代码:

#include <iostream>

using namespace std;

struct Materie    //grades 
    float romana;
    float matematica;
    float fizica;

;

struct Elev   // students structure, name, prename and grade obtained;
    char nume[30];
    char prenume[30];
    Materie nota;
;

void absolvent(Elev* elevi, int &n)  // fuction to remove studens with grade < 5
    for (int i = 0; i < n; i++) 
        if (elevi[i].nota.fizica < 5.0 || elevi[i].nota.matematica < 5.0 || elevi[i].nota.fizica < 5.0) 
            for (int j = i; j < n; j++) 
                *elevi[j].nume = *elevi[j + 1].nume;
                *elevi[j].prenume = *elevi[j + 1].nume;
                elevi[j].nota.romana = elevi[j + 1].nota.romana;
                elevi[j].nota.matematica = elevi[j + 1].nota.matematica;
                elevi[j].nota.fizica = elevi[j + 1].nota.fizica;
            
            n--;
            i--;
        
    



int main() 
    int n;
    do 
        cout << "Introduceti numarul de elevi: ";
        cin >> n;
        if (n < 0 || n > 30) 
            cout << "0 < n < 30";
         
     while (n < 0 || n > 30);
    Elev* elevi = new Elev[n];
    for (int i = 0; i < n; i++) 
        cout << "Introduceti numele elevului " << i + 1 << " : ";
        cin >> elevi[i].nume;
        cout << "Introduceti prenumele elevului " << i + 1 << " : ";
        cin >> elevi[i].prenume;
        cout << "Introduceti nota obtinuta la limba romana: ";
        cin >> elevi[i].nota.romana;
        cout << "Introduceti nota obtinuta la matematica: ";
        cin >> elevi[i].nota.matematica;
        cout << "Introduceti nota obtinuta la fizica: ";
        cin >> elevi[i].nota.fizica;
    
    cout << elevi[0].nume << endl;
    cout << *elevi[0].nume << endl;

    return 0;

我想实现一个函数,如果他获得的成绩之一小于 5,则从数组中删除 Elev(学生)。 我想通过使用数组而不是向量来做到这一点。

在进行练习时,提出了以下问题:

1)。为什么,在免除函数中,IDE 期望我将 * 传递给 elevi[i].nume(如果我只输入 elevi[i].nume: "expression must be a modifiable lvalue"),但是对于elevi[i].nota.romana 恰恰相反(我在尝试放置 elevi[i].nota.romana: "operand of '" must pe a pointer" 时出错)? p>

2)。为什么 elevi[0].nume 会返回“Alex”,例如,如果我在控制台中输入 Alex,但 *elevi[0].nume 只返回 A?

【问题讨论】:

*elevi[j].nume = *elevi[j + 1].nume; -- 这不是复制 C 样式字符数组的方式。数组不可使用= 复制。使用strcpy 如果你真的需要使用char数组而不是std::string,你应该了解strcpy和其他以null结尾的字节字符串函数 另外,for (int j = i; j &lt; n; j++) *elevi[j].nume = *elevi[j + 1].nume; -- 如果 n 是项目数,那么访问项目 j + 1 将导致最后一次迭代的越界访问。 【参考方案1】:

*elevi[j].nume只显示第一个字符的原因是和elevi[j].nume[0]一样,更明显。

您不能分配给数组,但您可以分配给包含数组的结构和类,并且解决方案比您想象的要简单得多。

for (int j = i; j < n-1; j++) 
    elevi[j] = elevi[j+1];

将完全按照您的意愿行事。 (请注意,您需要降低循环的末尾,否则您将超出有效索引。)

【讨论】:

以上是关于指向结构数组的指针仅显示 char 字段的第一个字符的主要内容,如果未能解决你的问题,请参考以下文章

void 类型的数组

从指向结构数组的指针中提取元素

Arduino指向结构变量的指针和指向结构数组的指针打印输出

为啥会无法输出字符串啊郁闷了。。。

指向结构体数组的指针

指向二维数组的指针