Nhập vào kí tự ‘u’ nhưng lại hiện là kí tự có mã ASCII là 10


C/C++
Mọi người trong group cho em hỏi là tại sao trong hình em nhập vào kí tự ‘u’ mà sao lại hiện là kí tự nào đó có id trong bảng ASCII là 10 ạ?
Lúc đầu thử em thấy lần nhập đầu tiên dù nhập đúng vẫn thấy sai nên em đã thêm đoạn khoanh đỏ để tỉm lỗi và phát hiện là trong lần nhâp đầu tiên kí tự em nhâp là 1 ký tự khác ạ.
Mong mọi người giúp đỡ ạ.
https://drive.google.com/drive/folders/1C_VGZJ38TrMtuCeNCGGyVMDaUx7tYvN6?usp=sharing

game.c:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#include<time.h>
#include"game.h"


char nhap_ky_tu() {
	char chu_cai_nhap_vao=0;
	chu_cai_nhap_vao = getchar();
	chu_cai_nhap_vao = toupper(chu_cai_nhap_vao);
	while (getchar() != '\n');
	return chu_cai_nhap_vao;
}

void ktra(char c, char string[],int s[]){
	int a=0;
	printf("tu vua nhap vao %c co id la %d\n",c,c);
	for (int i=0; i<strlen(string); i++) {
		printf("%c\n",string[i]);
		if (string[i] == c) {
			printf("Da tim thay ki ty!");
			s[i] = 1;
			a=1;
		}
	}
}

int win(int *s,int n) {
	int d=1;
	for (int i=0;i<n;i++) {
		if (s[i] == 0 ) d= 0;
	}
	return d;
}

int chontu(char *tuduocchon) {
	FILE *taptin = NULL;
	taptin = fopen("data.dht","r");
	if (taptin == NULL) {
		printf("Co loi trong viec lay du lieu!");
		return 0;
	}
	int dem=0,vitri_tuduocchon=0,kytu_hientai=0;
	char s[SO_KY_TU_DUOC_DOC];
	while ( fgets(s,SO_KY_TU_DUOC_DOC,taptin) != NULL) {
		dem++;
	}
	vitri_tuduocchon=random(dem);
	rewind(taptin);
	while (vitri_tuduocchon >0) {
		kytu_hientai=fgetc(taptin);
		if (kytu_hientai == '\n') vitri_tuduocchon--;
	}
	fgets(tuduocchon,SO_KY_TU_DUOC_DOC,taptin);
	tuduocchon[strlen(tuduocchon) -1] ='\0';
	fclose(taptin);
	giaima(tuduocchon);
	return 1;
}

int random(int max) {
	srand(time(NULL));
	return (rand( ) % max); 
}

void giaima( char *string) {
	for (int i=0; i< strlen(string);i++) {
		string[i] -=1;
	}
}

Dòng này:

Có ý nghĩa gì thế?
Nhớ là hàm tên là nhap_ki_tu (nhập kí tự) không phải chuỗi.

3 Likes

Em đẫ thử nếu ko có dòng này thì ấn lần 1 rồi nhấn enter thì phím enter sẽ thay luôn cho lần ấn thứ 2 ạ. Nên em phải cho cái đấy vào để lần 1 chỉ nhận 1 ký tự duy nhất không lấy phím enter ạ

10 là ký tự \n đó, là do em chưa xóa nó từ lần đọc lựa chọn đầu tiên (input 1\n)

em xài scanf("%c", &chu_cai_nhap_vao); để khỏi đọc nhầm ký tự khoảng trắng như \r\n\t\v hay space :V

4 Likes

Em vẫn chưa hiểu ạ? Tại sao mỗi lần nhập đầu tiên bị dính còn các lần nhập tiếp theo lại ko dính kí tự/n ạ?

tại vì em đã có ignore nó bằng while (getchar() != '\n') rồi. Chỉ có lần đầu tiên là em chưa ignore nó.

4 Likes

Dùng scanf em thử rồi ạ nhưng nó lại bị lỗi sang lần nhập tiếp theo ạ

vậy à :V vậy em ignore \n sau khi đọc lựa chọn số 1 là được

edit: à hình như scanf thêm \n vào thì đọc được nè:

#include  <stdio.h>

int main(void)
{
    int choice = 0;
    char ch = '\0';
    
    scanf("%d\n", &choice);
    printf("..%d\n", choice);
    
    scanf("%c\n", &ch);
    printf("..%c\n", ch);
    
    scanf("%c\n", &ch);
    printf("..%c\n", ch);
    
    scanf("%c\n", &ch);
    printf("..%c\n", ch);
    
    return 0;
}

https://rextester.com/RYCHD28531

4 Likes

Thêm “/n” vào scanf là thay cho việc nhập enter để đến dòng tiếp theo đúng ko ạ? Em chưa test đc nên ko biết code trên hđ như nào khi thêm /n vào ạ

khi em nhập dữ liệu em nhập “1” rồi nhấn enter là em input “1\n” vào chứ ko phải chỉ có “1”. Em thêm \n vào scanf để nó ignore ký tự thừa này.

5 Likes

Anh ơi thêm cái fflush(stdin) vào trước khi nhập kí tự là được luôn này anh

Code bạn đưa chưa đầy đủ nên ko biết chính xác bị dư \n ở dòng nào, tuy nhiên lý do thì khá dễ hiểu thôi, trong bộ nhớ đệm còn dư ký tự \n từ lần nhập trước. Cần xóa bộ nhớ đệm đi, trước khi getchar() bằng fflush(stdin) hoặc là while (getchar() != '\n');

3 Likes

fflush(stdin) ko phải chuẩn của C, em đem qua Visual Studio chạy ko đúng nha :V

4 Likes

vậy là en nên để thêm 1 vòng lăp while lên đầu trc khi nhập kí tự đúng ko ạ?

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