30/09/2018, 16:57

bài tập về struct chạy sai kết quả ạ

bài toán về struct: tìm kiếm theo tên sinh viên của em chạy ra kết quả sai, và còn nhiều đoạn em chưa hiểu. Ai xem giúp em với ạ. em cảm ơn!

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>

/*
                THAC MAC BAI TOAN.
        sv *TimKiem(char *, sv *); tai sao o day truyen vao mot con tro? ma khi goi no ta khong lay dia chi cua t: if((p = TimKiem( &t, s)) != NULL)
        ma lai la: if((p = TimKiem(t, s)) != NULL) chi truyen vao t??
        
        => bai toan van sai: khi nhap ten khong giong nhau nhung truong trinh van ra ket qua?
*/

#pragma pack (1) // tranh lam tron bo nho.
// khai bao cau truc sinhvien: ten, tuoi, ma sinh vien
struct sinhvien
{
    char ht[25];
    int tuoi;
}; typedef struct sinhvien sv;
sv *TimKiem(char *, sv *);

int main()
{
    sv *p, s[50];
    int i = 0;
    char t[25];
    p = s; // cho con tro p tro den mang cau truc s.
    while(1)
    {
        printf("
Nhap vao ten sinh vien thu %d la: ", i++);
        fflush(stdin);// xoa bo nho dem.
        gets(t);
        if(t[0] != '') // ten khac rong.
        {
            strcpy(p->ht, t); // copy ten tu t => ht
            printf("
nhap tuoi: ");
            scanf("%d%*c", &p->tuoi); // %*c bo qua 1 ky tu khoang trang', tranh troi lenh.
            p++; // tang dia chi cua con tro p.
        }
        else    
        {
            p = NULL;// ket thuc
            break;
        }
    }
    printf("
Nhap vao ten can tim: ");
    fflush(stdin);
    gets(t);
    if( (p = TimKiem(t,s)) != NULL) // dau tien gan p = gia tri tra ve cua ham tin kiem, sau do so sanh voi NULL.
    {
        printf("
ho ten: %s
tuoi: %d", p->ht, p->tuoi);    
    }    
    
    getch();
    return 0;
}
// ham tra ve 1 con tro kieu du lieu sv, co doi truyen vao la: ten va con tro p tro toi kieu du lieu sv
sv *TimKiem(char *t, sv *p)
{
    // thac mac': o day dau tien la kiem tra voi p[0]???
    while(p != NULL)
    {
        if(strcmpi(p->ht, t) == 0)
            return p;
        p++; // tag dia chi cua p.
    }
    return NULL; 
}
Nguyễn Minh Dũng viết 19:02 ngày 30/09/2018

Câu hỏi này không rõ ràng

Van Cuong viết 18:59 ngày 30/09/2018

anh ơi, ví dụ: em đã nhập dữ liệu cho sinh viên, và em nhập tên trong hàm tìm kiếm: không trùng với dữ liệu nhập thì trương trình chạy vẫn ra kết quả như này ạ.

Phạm Hoàng Tuấn viết 19:12 ngày 30/09/2018

Trong hàm tìm kiếm của e điều kiện dừng k đúng? p luôn khác null và nó sẽ nhảy lên vô hạn, có thể nhảy tới vùng nhớ cấm và báo lỗi hoặc tràn bộ nhớ? a thử sửa lại chạy có vẻ ổn, do e khai báo mảng 50 phần thử nên e phải giới hạn tìm trong 50 phần tử thôi.

// DemoStruct.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>

/*
THAC MAC BAI TOAN.
sv *TimKiem(char *, sv *); tai sao o day truyen vao mot con tro? ma khi goi no ta khong lay dia chi cua t: if((p = TimKiem( &t, s)) != NULL)
ma lai la: if((p = TimKiem(t, s)) != NULL) chi truyen vao t??

=> bai toan van sai: khi nhap ten khong giong nhau nhung truong trinh van ra ket qua?
*/

#pragma pack (1) // tranh lam tron bo nho.
// khai bao cau truc sinhvien: ten, tuoi, ma sinh vien
struct sinhvien
{
	char ht[25];
	int tuoi;
}; typedef struct sinhvien sv;
sv *TimKiem(char *, sv *);

int _tmain(int argc, _TCHAR* argv[])
{
	sv *p, s[50];
	int i = 0;
	char t[25];
	p = s; // cho con tro p tro den mang cau truc s.
	while (1)
	{
		printf("\nNhap vao ten sinh vien thu %d la: ", i++);
		fflush(stdin);// xoa bo nho dem.
		gets_s(t);
		if (t[0] != '\0') // ten khac rong.
		{
			strcpy_s(p->ht, t); // copy ten tu t => ht
			printf_s("\nnhap tuoi: ");
			scanf_s("%d%*c", &p->tuoi); // %*c bo qua 1 ky tu khoang trang', tranh troi lenh.
			p++; // tang dia chi cua con tro p.
		}
		else
		{
			p = NULL;// ket thuc
			break;
		}
	}
	printf("\nNhap vao ten can tim: ");
	fflush(stdin);	
	gets_s(t);
	//sv * temp = TimKiem(t, s);
	if ((p = TimKiem(t, s)) != NULL) // dau tien gan p = gia tri tra ve cua ham tin kiem, sau do so sanh voi NULL.
	{
		printf("\nho ten: %s\ntuoi: %d", p->ht, p->tuoi);
	}
	else
	{ 
		printf_s("Khong tim thay");
	}
	gets_s(t);
	return 0;
}
// ham tra ve 1 con tro kieu du lieu sv, co doi truyen vao la: ten va con tro p tro toi kieu du lieu sv
sv *TimKiem(char *t, sv *p)
{
	// thac mac': o day dau tien la kiem tra voi p[0]???
	int i = 0;
	while (p != NULL && i<=49)
	{
		if (_strcmpi(p->ht, t) == 0)
			return p;
		p++; // tag dia chi cua p.
		i++;
	}
	return NULL;
}
Van Cuong viết 19:11 ngày 30/09/2018

vâng, cảm ơn anh ạ

Bài liên quan
0