Hỏi về code trong quyển Tài Liệu C chương 2

Dạ tình hình là em đang làm cái trò chơi cuối bài để kết thúc…em đọc tới khúc này thì không hiểu…mấy anh chị giải thích giùm em…tại sao trong while(getchar() != ‘\n’) lại không có câu lệnh trong đó @@

char docKytu ( ) 
{ 
char kytuNhapVao = 0;
kytuNhapVao = getchar ( ); // Doc ky tu duoc nhap dau tien
kytuNhapVao = toupper (kytuNhapVao); // Viet hoa ky tu do
// Lan luot doc tiep cac ky tu khac cho den khi gap \n
while (getchar ( ) != '\n') ;
return kytuNhapVao; // Tra ve ky tu dau tien doc duoc
} 

Với bên dưới là code của em làm để chạy trò chơi…nhưng tới lúc so sánh ký tự thì không được @@ tại sao vậy ạ…code em tự viết nên có hơi khó hiểu với chưa tối ưu…mấy anh chị thông cảm

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h>
#include <string.h>
#include <ctype.h> 
char kiemtra(); 
int main () 
{ 
	FILE *teptin; 
	teptin = fopen ("D:\\Source.txt" , "r"); 

	char c = 0 ;
	char array1[50] = "" ;  //Lưu số dòng đếm được
	char array2[50] = "" ; //Lưu từ bí mật cần đoán
	char array3[50] = "" ; //Thay thế ký tự trong array2 thành * rồi hiện lên màn hình
	int max = 0 ;			//số dòng trong văn bản
	int sobimat;			//số dòng đuoc random
	const int min = 1;
	int len;				
	int j = 0 ;

while(fgets(array1 , 50 , teptin) != NULL) //Đọc số dòng trong text
{
	
	max++;

}

	srand(time(NULL));							//tạo số dòng cần đọc random
	sobimat = (rand() % (max - min + 1) + min);
	rewind (teptin);

	
	for(int i = 0 ; i < sobimat ; i++) // đọc dòng được random
	{
	
	fgets(array2,50,teptin);
	
	}

	len = strlen (array2) - 1;
	

	for(int i = 0 ; i < len ; i++) //thay the tu can doan bang ky tu *
	{
	
		array3[i] = '*';
	}


	printf ("\nLet's Play Hangman !!! \n"); 
	printf("%s",array2);
	for(int i = 10 ; i > 0 ; i-- ) 
	{
	printf("So luot hien tai cua ban la: %d\n",i);
	printf("Tu bi an la gi? %s\n",array3);
	printf("Hay doan mot chu cai: "); 
	kiemtra();
	c = kiemtra();

	while( j <= len )
	{
	
	if(c == array2[j]) 
		{

		printf("dung");
		array3[j] = c;

		}
	j++;
	
	}


	printf("Tu can doan la: %s\n ",array3);
} 
return 0; 
} 

char kiemtra()
{
	char c = 0 ;
	c = getchar(); 
	while(getchar() != '\n');
	return c;
}

sao lại xài kiemtra() 2 lần?
sao lại sửa tên là kiemtra()? Tên dockytu() hợp lý hơn chứ?

while(getchar() != ‘\n’) tức là đọc từng ký tự một tới khi nào gặp ký tự newline \n (xuống dòng) thì dừng. Ko cần thêm câu lệnh nào nữa. Dòng này để tránh trường hợp thay vì nhập 1 ký tự duy nhất rồi nhấn enter thì người chơi lại nhập nhiều hơn 1 ký tự rồi mới enter.

2 Likes

dạ em đặt tên func đại thôi chứ có biết gì đâu =)) mà cái dòng kiemtra() đầu là để gọi hàm…còn cái hai là để dùng cái ký tự c được nhập

getchar() != '\n' 

chẳng là lệnh đó bạn?

c = kiemtra();

là nó đã gọi hàm rồi trả về giá trị rồi không cần gọi kiểm tra ở trên đâu. :smile:

2 Likes

Dạ em cảm ơn , em làm được ròi :smiley: khoe hàng tí =))

link tài liệu này ở đâu vậy bạn ??

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