指向结构数组的指针仅显示 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 < 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 字段的第一个字符的主要内容,如果未能解决你的问题,请参考以下文章