Xóa phần tử trong mảng struct

#include<iostream>
#include<string.h>
using namespace std;
struct hocsinh
{
	char hoten[100];
};
void nhaphs(hocsinh & hs)
{
	cout<<"nhap ho ten:";gets(hs.hoten);
}
void xuaths(hocsinh hs)
{
	puts(hs.hoten);
}
void nhapmanghs(hocsinh A[100],int&n)
{
	for (int i=0;i<n;i++)
		nhaphs(A[i]);
}

void xuatmanghs(hocsinh A[100],int&n)
{
	for (int i=0;i<n;i++)
		xuaths(A[i]);
}

char *ten(char ht[100])
{
	char s1[100];
	int i,a=0;
	i=strlen(ht)-1;
	while(isspace(ht[i])==0)
		i--;
	for (int j=i+1;j<strlen(ht);j++)
	{
		s1[a]=ht[j];
		a++;
	}
	return s1;
}


void xoa (hocsinh A[100], int n)
{
	for (int i=0; i<n; i++)
	{
		if (ten(A[i].hoten) == "Hung")
		{
			int index =i;
			for (i=index; i<n; i++)
			{
				A[i] = A[i+1];
			}
			n--;
		}
	}
	xuatmanghs (A,n);
}
int main()
{
	hocsinh A[100];
	int n=4;
	nhapmanghs(A,n);
	xoa (A,n);
}

yêu cầu của bài là xóa những người tên mình muốn.
em đã trích tên ra từ full name, nhưng khi xóa thì nó chỉ mỗi tên cuối cùng.

Chương trình của bạn có một vài vấn đề:

  • Hàm char *ten(char ht[100]) trả về địa chỉ của s1 được cấp phát bên trong hàm, khi thoát khỏi hàm thì s1 sẽ bị hủy.

  • Sử dụng tham chiếu không đúng chỗ. Hàm cần dùng thì không dùng (vd như hàm xoa() có thay đổi n), hàm không cần thì lại dùng (các hàm còn lại).


Chấm 2 thì bạn tự xử lý được, vậy còn chấm 1, làm sao để chỉ trả về tên thôi. :question:

Thực chất bạn không cần đến một hàm trả về tên để làm gì, mà cái bạn cần là một hàm so sánh. :slight_smile:

Gợi ý cho bạn:
Tạo một hàm nameCompare(const char *fullName, const char *name).

  • Trả về true nếu tên của fullName trùng với name.
  • Ngược là là false.
3 Likes

Nhưng đề bài lại bảo nhập họ và tên luôn, chứ không phải nhập mỗi tên :sob:

Bởi vậy mới phải tách tên :smiley: tất nhiên là tách ra để so sánh.

3 Likes

Tách tên rồi so sánh ngay trong hàm đó luôn. :slight_smile:

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?