Từ 1 tới 6 trên tổng số 6 kết quả

Đề tài: tạo mảng 2 chiều chứa cả chữ lẫn số cấp phát động

  1. #1
    Ngày gia nhập
    03 2012
    Bài viết
    4

    Mặc định tạo mảng 2 chiều chứa cả chữ lẫn số cấp phát động

    Code:
    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    void nhap(char **a,int n,int m)
    {
    	int i,j;
    	for(i=0;i<n;i++)
    		for(j=0;j<m;j++)
    		{
    			printf("nhap a[%d][%d]= ",i,j);
    			scanf("%c",&a[i][j]);	//&a[i][j]
    		}
    }
    
    void xuat(char **a,int n,int m)
    {
    	int i,j;
    	for(i=0;i<n;i++)
    	{
    		for(j=0;j<m;j++)
    			printf("%c", 	a[i][j]);	//(*(a+i))[j]
    	}
    }
    
    void main()
    {
    	char **a;
    	int d, c;
    	
    	scanf ("%d", &d);
    	scanf ("%d", &c);
    
    	a= ((char**) malloc (d*sizeof(char*)));			//	matrix cap phát dòng
    	
    	for (int i=0;i<d;i++)					//	khai báo so dong 
    		a[i]=(char*) malloc (c*sizeof(char));		//	khai báo so cot 
    		
    	nhap (a,d,c);
    	
    	xuat (a,d,c);
    	
    
    	for (i=0;i<d;i++)							
    
    		free (a[i]);                                       
    		free (a);
    
    	getch();
    }
    em khai báo mảng 2 chiều kiểu char,nhưng vẫn còn vướng mắc ở hàm nhập vì khi scanf %c thì nó lấy đến 2 vùng nhớ, nhập phần tử đầu tiên thì nó lại gán vào a[0][1] chứ không phải a[0[0], làm sao để sửa chỗ này để có thể nhập cả chữ lẫn số vào mảng

  2. #2
    Ngày gia nhập
    10 2011
    Bài viết
    552

    thay vì scanf %c thì bạn có thể dùng hàm chuyên dùng để nhập ký tự như
    getch, getchar, getchr , getc gì gì đấy. lật thư viện ra coi cho rõ.

    Thao tác nhập dữ liệu bởi mấy cái thể loại này thường thiếu an toàn do tràn bộ đệm.
    VÍ dụ bạn scanf lần 1, nhập vào A rồi bấm Enter, thì nó sẽ lấy vào chữ A, Ký tự enter vẫn còn ở bộ đệm, scanf lần 2 thì chưa kịp nhập vào gì thì nó đã tự động lấy ký tự Enter vào rồi, và trôi qua scanf lần 3.
    Đại ý là vậy
    Khắc phục: thêm thao tác fflush(stdin); trước hàm scanf để xóa bộ đệm
    Um Mani Padme Hum...!!

  3. #3
    Ngày gia nhập
    03 2012
    Bài viết
    4

    đã thêm fflush như b nói và làm được, cám ơn nhiều ^^, tuy vẫn chưa hiểu tại sao khi khai báo kiểu char** thì lại bị hiện tượng này còn int** thì không cần fflush vẫn hoạt động bình thường

  4. #4
    Ngày gia nhập
    10 2011
    Bài viết
    552

    int ** mà nhập dữ liệu vẫn là scanf %c hay là %d ?
    Um Mani Padme Hum...!!

  5. #5
    Ngày gia nhập
    03 2012
    Bài viết
    4

    int thì để %d, nếu để %d thì nó sẽ không nhận kí tự enter nên sẽ không bị hiện tượng bỏ qua scanf, mình hiểu vậy đúng không?

  6. #6
    Ngày gia nhập
    10 2011
    Bài viết
    552

    Mặc định tạo mảng 2 chiều chứa cả chữ lẫn số cấp phát động

    Để kiểm tra thì bạn khai báo int ** còn nhập dữ liệu thì scanf %c là sẽ hiểu ^^. Mọi thứ trong tầm tay bạn
    Um Mani Padme Hum...!!

Các đề tài tương tự

  1. Trả lời: 2
    Bài viết cuối: 21-04-2013, 09:46 AM
  2. Lỗi: bố cục trang web tự tăng theo chiều ngang khi chiều cao thay đổi
    Gửi bởi tuanngocpt trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 2
    Bài viết cuối: 16-03-2013, 11:25 PM
  3. Trả lời: 1
    Bài viết cuối: 28-04-2012, 09:43 PM
  4. Cách truyền mang 1 chiều cho hàm bài con trỏ và mảng một chiều ai có thể giải thích giúp mình
    Gửi bởi biencute trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 8
    Bài viết cuối: 21-03-2012, 09:00 AM
  5. Lời giải bài tập: Chuỗi Ký tự, mảng số nguyên 1 chiều, mảng 2 chiều, tạo Menu
    Gửi bởi xuanngoc trong diễn đàn Thủ thuật, Tutorials và Mã nguồn C/C++/C++0x
    Trả lời: 0
    Bài viết cuối: 15-10-2011, 01:17 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn