Khi input chặn chữ vào chương trình

Chào các bạn daynhauhoc.com

  • Khi mình input lựa chọn vào thì chương trình tự động lặp lại input, debug thì không có lỗi nào cả.
 * File:   main.c
 * Author: luuhoangvu
 *
 * Created on June 7, 2019, 9:35 AM
 */

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

double earnings;
FILE *f;

/*
 * 
 */
void showMenu() {
    printf("----------------\n");
    printf("1) Play Game.\n");
    printf("2) Save Game.\n");
    printf("3) Cash Out.\n");
    printf("----------------\n");
}

int checkChoice(int *pcheckChoice) {
    int checking;
    int letter;
    do {
        checking = scanf("%d%c", pcheckChoice, &letter);
        if (checking == 2 && letter == '\n') {
            return *pcheckChoice;
        } else
            printf("Input again: ");
        fpurge(stdin);
    } while (checking != 2 || letter != '\n');
}

void playGame() {
    int digits1, digits2, digits3;
    digits1 = rand() % 10;
    digits2 = rand() % 10;
    digits3 = rand() % 10;
    printf("=> The slot machine: %d%d%d", digits1, digits2, digits3);
    int sameCount;
    sameCount = (digits1 == digits2) + (digits2 == digits3) + (digits1 == digits3);
    earnings -= 0.25;
    if (sameCount == 0) {
        printf("You don't win anything!\n");
    }
    if (sameCount == 1) {
        printf("You win 50 cent!\n");
        earnings += 0.5;
    }
    if (sameCount == 3) {
        printf("You win the big prize!!!!\n");
        earnings += 10.0;
    }
}

void saveGame() {
    f = fopen("savedMoney.txt", "w");
    fprintf(f, "%.2lf", earnings);
    fclose(f);
    printf("Your money had saved!\n ");
}

void cashOut() {
    printf("Thank you for playing! Your money $%.2lf", earnings);
}

void restoreMoney() {
    f = fopen("savedMoney.txt", "r");
    if (f == NULL) {
        earnings = 10.0;
    } else
        fscanf(f, "%lf", &earnings);
    fclose(f);
}

void imPlement() {
    int choice;
    do {
        if (earnings == 0) {
            printf("You run out of money, please deposit more money!!!\n");
            break;
        }
        printf("You have $%.2lf\n", earnings);
        showMenu();
        printf("Choose one of the following options menu\n");
        checkChoice(&choice);
        switch (choice) {
            case 1: playGame();
                break;
            case 2: saveGame();
                break;
            case 3: cashOut();
                break;
        }
    } while (choice != 3);
    getchar();
    getchar();
}

int main(int argc, char** argv) {
    srand(time(0));
    restoreMoney();
    imPlement();
    restoreMoney();
    return 0;
}
int checkChoice(int *pcheckChoice) {
    int checking;
    int letter;
    do {
        checking = scanf("%d%c", pcheckChoice, &letter);
        if (checking == 2 && letter == '\n') {
            return *pcheckChoice;
        } else
            printf("Input again: ");
        fpurge(stdin);
    } while (checking != 2 || letter != '\n');
}
  • Mục đích của hàm này là nhập giá trị cho choice đúng không, khi gọi hàm bạn không gán nó vào bất kỳ biến nào, vậy nên để int checkChoice() là quá thừa thãi.

  • Còn nữa nội dung bên trong thì cũng không đúng với chức năng của hàm.

Bạn nên thay nó thành cái này :point_down:

void checkChoice(int *pcheckChoice) {
	do {
		scanf("%d", pcheckChoice);
		while (getchar() != '\n');
		if (*pcheckChoice < 1 || *pcheckChoice > 3)
			printf("Input again: ");
	}while (*pcheckChoice < 1 || *pcheckChoice > 3);
}
4 Likes
  • Mục đính của mình là viết 1 một hàm riêng để sau này dùng để chặn cho không user nhập chữ cái vào cho những bài khác nữa ấy.
  • Của bạn là chỉ áp dụng cho bài này thôi đúng không bạn ?

Nếu muốn chặn ng dùng nhập chữ cái thì bạn chỉ việc thêm một câu lệnh này:

*pcheckChoice = 0;

và sửa hàm checkChoice() thành :point_down:

void checkChoice(int *pcheckChoice) {
   *pcheckChoice = 0;
   do {
   	scanf("%d", pcheckChoice);
   	while (getchar() != '\n');
   	if (*pcheckChoice < 1 || *pcheckChoice > 3)
   		printf("Input again: ");
   }while (*pcheckChoice < 1 || *pcheckChoice > 3);
}

vì hàm scanf("%d", pcheckChoice); nó sẽ vẫn giữ giá trị của choice nếu nhập vào là chữ cái.

4 Likes

Cảm ơn bạn nhieu nhé :v:t2:

@Sherly1001

  • Cho mình hỏi thêm là trường hợp trên thì có cần dùng fflush(stdin) hoặc fpurge(stdin) để xóa bộ nhớ đêm khi bắt đầu scanf() không bạn. Nếu có thì nên thêm như thế nào.

Mình đã làm sạch bộ nhớ r. Chỗ :point_down:

scanf("%d", pcheckChoice);
while (getchar() != '\n');
4 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?