30/09/2018, 23:09

Thắc mắc về toán tử điều kiện và con trỏ char?

Em viết chương trình đọc số điện thoại và em có 2 thắc mắc nhờ các sư huynh giải đáp

  1. Ở toán tử điều kiện trong hàm KiemTra em thấy if rồi && quá nhiều. Vậy có cách nào để rút gọn toán tử điều kiện đó không?
  2. Chương trình của em khai báo sdt có độ dài là 11 nhưng khi chạy chương trình nhập rất nhiều số mà nó vẫn đúng rõ ràng em khai báo độ dài là 11 sao nó không báo lỗi nhỉ?

Cảm ơn các sư huynh đã giải đáp!

Code em:

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

int KiemTra(char *sdt)
{
	int i = 0;

	for(; i < strlen(sdt); i++)
	{
		if(sdt[i] != '0' && sdt[i] != '1' && sdt[i] != '2' && sdt[i] != '3' && sdt[i] != '4' && sdt[i] != '5' && sdt[i] != '6' && sdt[i] != '7' && sdt[i] != '8' && sdt[i] != '9') 
		{
			printf("So dien thoai nhap sai");
			return 1;
			break;
		}
	}

	return 0;
}

void DocSo(char *sdt)
{
	int i = 0;
	
	if(KiemTra(sdt) == 0)
	{
		for(; i < strlen(sdt); i++)
		{
			switch(sdt[i])
			{
				case '0':
					printf(" khong ");
					break;

				case '1':
					printf(" mot ");
					break;

				case '2':
					printf(" hai ");
					break;

				case '3':
					printf(" ba ");
					break;

				case '4':
					printf(" bon ");
					break;
				case '5':
					printf(" nam ");

				case '6':
					printf(" sau ");
					break;

				case '7':
					printf(" bay ");
					break;
				case '8':
					printf(" tam ");

				case '9':
					printf(" chin ");
					break;
			}
		}
	}
}

int main()
{
	char sdt[11];

	printf("Nhap sdt: ");
	fflush(stdin);
	gets(sdt);

	DocSo(sdt);

	getch();
	return 0;
}
Sơn viết 01:13 ngày 01/10/2018
  1. Chương trình của em khai báo sdt có độ dài là 11 nhưng khi chạy chương trình nhập rất nhiều số mà nó vẫn đúng rõ ràng em khai báo độ dài là 11 sao nó không báo lỗi nhỉ?

đén 1 lúc nào đó nó sẽ bị buffer overflow, bạn đừng nên dùng gets(), bởi vì nó không giói hạn số kí tự nhập vào, nên dùng
fgets(sdt,11,stdin)

*grab popcorn* viết 01:12 ngày 01/10/2018

Ở toán tử điều kiện trong hàm KiemTra em thấy if rồi && quá nhiều. Vậy có cách nào để rút gọn toán tử điều kiện đó không?

Ký tự thì ở trong C được lưu trữ dưới dạng số (keyword: ASCII), và từ ‘0’ = 48, ‘1’ = 49 …
~> Vậy ta có thể thay mớ đó bằng
if(char >=‘0’ && char <=‘9’).

Chương trình của em khai báo sdt có độ dài là 11 nhưng khi chạy chương trình nhập rất nhiều số mà nó vẫn đúng rõ ràng em khai báo độ dài là 11 sao nó không báo lỗi nhỉ?

Đó là sự ảo diệu của C.
Khi bạn nhập lố, thì nó vẫn tràn qua các ô nhớ tiếp theo và ghi đè lên tiếp. Bất chấp bạn khai báo chỉ có 11 phần tử.
Vậy nên người ta nói các hàm gets, scanf thg nguy hiểm là vậy.
Nếu muốn đúng 11 ký tự có thể dùng scanf("%11s", &sdt)
hoặc fgets(stdout, 11, sdt);
Thì cho dù nhập hơn, chương trình cũng chỉ lấy đúng 11 ký tự, các ký tự còn lại sẽ được bỏ qua.

Nguyễn Tuấn Nam viết 01:13 ngày 01/10/2018

yep, thank you so much. i’m crazy =)))

Bài liên quan
0