<![CDATA[Latest posts for the topic "[Thảo luận] Validate input data - C++"]]> /hvaonline/posts/list/23.html JForum - http://www.jforum.net [Thảo luận] Validate input data - C++ Code:
......
     int x;
     cin>>x;
     .......
+ Điều gì sẽ xảy ra nếu người dùng nhập dữ liệu không đúng: ký tự 'a' chẳng hạn? + Làm sao để kiểm tra dữ liệu này? ]]>
/hvaonline/posts/list/16321.html#97831 /hvaonline/posts/list/16321.html#97831 GMT
Re: [Thảo luận] Validate input data - C++ Code:
int x;
if (!(cin >> x)) {
    cout << "Error"; // nếu quá trình đọc bị lỗi thì in ra Error
} else {
    cout << x; // quá trình đọc không lỗi, in ra x;
}
tham khảo thêm ở http://www.arachnoid.com/cpptutor/student1.html. :d ]]>
/hvaonline/posts/list/16321.html#97858 /hvaonline/posts/list/16321.html#97858 GMT
Re: [Thảo luận] Validate input data - C++

K4i wrote:
các hàm của C++ thì đều trả ra một giá trị nào đó và qua giá trị đó ta có thể xác định được hàm đó thực thi đúng hay không. Ở đây, hàm cin trả ra 2 giá trị true và false Code:
int x;
if (!(cin >> x)) {
    cin >> "Error";// nếu quá trình đọc bị lỗi thì in ra Error
} else {
    cin >> x; // quá trình đọc không lỗi, in ra x;
}
tham khảo thêm ở http://www.arachnoid.com/cpptutor/student1.html. :d  
Ối, hình như 2 dòng này ko phải để in ra thì phải :D Code:
cin >> "Error";// nếu quá trình đọc bị lỗi thì in ra Error
.....
cin >> x; // quá trình đọc không lỗi, in ra x;
FaL muốn thảo luận thêm về vấn đề: + Điều gì xảy ra sau khi nhập sai? + Nhập lại sau khi nhập sai thì phải làm thế nào? :D Cái link của bạn cho khá hay, nhưng có lẽ giải thích một chút bằng tiếng Việt tốt hơn. Thân, FaL. ]]>
/hvaonline/posts/list/16321.html#97941 /hvaonline/posts/list/16321.html#97941 GMT
Re: [Thảo luận] Validate input data - C++ /hvaonline/posts/list/16321.html#97982 /hvaonline/posts/list/16321.html#97982 GMT Re: [Thảo luận] Validate input data - C++ Code:
cin.clear(); // hàm này có tác dụng là xóa lỗi (clear error)
sau đó, chúng ta bắt buộc phải xóa bộ nhớ đệm để chuẩn bị cho lần nhập kế tiếp Code:
cin.ignore (80, '\n');
còn đây là chương trình chạy thử của mình Code:
// chương trình này thực hiện đọc một số nguyên và in ra số nguyên đó.
// nếu nhập sai, phải nhập lại
#include <iostream>

using namespace std;

int main() {
	int x;
	while (!(cin >> x)) {
		cin.clear();
		cin.ignore (80, '\n');
		cout << "Error " << endl;
		cout << "Try again: ";
	}
	cout << x;
	return 0;
}
:d]]>
/hvaonline/posts/list/16321.html#97988 /hvaonline/posts/list/16321.html#97988 GMT
Re: [Thảo luận] Validate input data - C++ K4i đã nói việc nhập dữ liệu sai sẽ khiến cin không thể tiếp tục làm việc. Tuy nhiên ở đây có 2 dạng nhập sai căn bản: + Nhập vào một số nguyên vượt quá giới hạn đã định (int): Trong trường hợp này chỉ cần dọn dẹp stream là có thể nhập lại giá trị cho biến: Code:
cin.clear(int)
+Nhập vào một vài ký tự: trong trường hợp này cin vẫn trả về giá trị 0 (false) nhưng giá trị trong stream vẫn "hợp lệ", hàm cin.clear() sẽ không có hiệu lực xóa stream, việc nhập lại dữ liệu sẽ không được tiếp tục. K4i đề xuất dùng: Code:
cin.ignore(80,"\n")
có tác dụng xóa 80 byte khỏi stream hoặc khi gặp ký tự "\n". Trường hợp này điều gì sẽ xảy ra nếu người dùng nhập 1 string dài hơn 80? Lúc này sẽ xuất hiện vài dòng "Try again .." tương ứng với việc vòng lặp phải lặp lại vài lần để xóa hết stream. Phải chọn số bao nhiêu cho cin.ignore(int,"\n") để có thể xóa hết? Cách này có vẻ vẫn chưa tối ưu? 2. Vậy làm sao để validate một cách chính xác? Trong tầm hiểu biết của mình, FaL đề xuất 1 cách giải quyết. Đó là việc đọc dữ liệu nhập vào bằng string - string sẽ không giới hạn kích thước của chuỗi nhập vào: Code:
class StringClass {
  char *p;
  int len;
public:
  StringClass(char *ptr)
  {
    len = strlen(ptr);
    p = (char *) malloc(len+1);
    if(!p) {
      cout << "Allocation error\n";
      exit(1);
    }
    strcpy(p, ptr);
  }
  ~StringClass() { 
    cout << "Freeing p\n"; free(p); 
  }

  void show() 
  {
    cout << p << " - length: " << len;
    cout << endl;
  }
};
string sẽ "chấp nhận" tất cả các ký tự nhập vào từ bàn phím, từ đó ta sẽ dùng 1 hàm atoi() để kiểm tra xem string nhập vào có phải số hay ko. Lưu ý: Code:
atoi(char*)
bởi vậy nếu muốn convert string sang integer dùng: Code:
atoi(sting.c_std)
Không biết cách giải quyết trên đã trọn vẹn chưa, có gì sai sót mong mọi người góp ý! FaL]]>
/hvaonline/posts/list/16321.html#98252 /hvaonline/posts/list/16321.html#98252 GMT
Re: [Thảo luận] Validate input data - C++ /hvaonline/posts/list/16321.html#98362 /hvaonline/posts/list/16321.html#98362 GMT Re: [Thảo luận] Validate input data - C++ /hvaonline/posts/list/16321.html#98369 /hvaonline/posts/list/16321.html#98369 GMT Re: [Thảo luận] Validate input data - C++

FaL wrote:
@K4i đó là định nghĩa class string của C++, FaL chỉ copy lại thôi, trong constructor viết như vậy là an toàn, khi đã kiểm tra bộ nhớ trước khi dùng strcpy. Theo ý kiến riêng của FaL, sử dụng an toàn hay ko phần lớn là do người dùng. Thân. 
hi, FaL. Hôm nay ngồi rỗi, xử lý lại cái lỗi của code lần trước. Thấy cũng ổn. FaL cho thêm ý kiến nhé: Code:
#include <iostream>
#include <cstdio>

using namespace std;

int main()
{
	int x;
	while (!(cin >> x)) {
		cout << "Error: " << endl;
		cout << "Try again: ";
		cin.clear(); // xóa cờ lỗi của cin
		fflush (stdin); // xóa toàn bộ bộ nhớ đệm, chuẩn bị cho lần nhập kế tiếp
	}
	cout << x;
    return 0;
}
==> cái này là sự pha trộn giữa C và C++. :d]]>
/hvaonline/posts/list/16321.html#98590 /hvaonline/posts/list/16321.html#98590 GMT
Re: [Thảo luận] Validate input data - C++ /hvaonline/posts/list/16321.html#98599 /hvaonline/posts/list/16321.html#98599 GMT Re: [Thảo luận] Validate input data - C++

K4i wrote:
uh, gõ nhầm. :^) Còn về vấn đề phát hiện lỗi thì thực ra rất đơn giản, nó dựa vào chính việc xây dựng các hàm của C++. Theo mình biết thì rất nhiều các hàm của C++ đều có giá trị trả ra thay vì mang giá trị void thuần túy như của C. Nên mình chỉ dựa vào đó để tìm xem hàm cin trả ra giá trị gì mà thôi. Chính vì thế, khi nhập sai hàm cin sẽ trả ra giá trị false và biến x sẽ được gán một giá trị nào đó (phụ thuộc vào compiler). Còn về việc xử lý việc nhập lại, ở trong link mình đưa ra đã nói rất rõ nhưng ở đây mình sẽ nói lại một chút: Khi bạn nhập sai, cờ false sẽ được bật lên và khi đó không thể sử dụng lại được câu lệnh cin >> x. Để sửa, dùng hàm Code:
cin.clear(); // hàm này có tác dụng là xóa lỗi (clear error)
sau đó, chúng ta bắt buộc phải xóa bộ nhớ đệm để chuẩn bị cho lần nhập kế tiếp Code:
cin.ignore (80, '\n');
còn đây là chương trình chạy thử của mình Code:
// chương trình này thực hiện đọc một số nguyên và in ra số nguyên đó.
// nếu nhập sai, phải nhập lại
#include <iostream>

using namespace std;

int main() {
	int x;
	while (!(cin >> x)) {
		cin.clear();
		cin.ignore (80, '\n');
		cout << "Error " << endl;
		cout << "Try again: ";
	}
	cout << x;
	return 0;
}
:d 
Cảm ơn bác Dương, em cũng đang mắc chỗ này, nhất là trong bài sắp xếp sinh viên yêu cầu nhập số nguyên (là số sinh viên cần nhập) để cấp phát động cho cấu trúc sinh viên. Khi nhập ko phải là số nguyên thì chương trình nhảy loạn cả lên. Ko hổ danh thành viên đội tuyển phần mềm nguồn mở Coltech thì Tin học SV toàn quốc 2007]]>
/hvaonline/posts/list/16321.html#98806 /hvaonline/posts/list/16321.html#98806 GMT
Re: [Thảo luận] Validate input data - C++ Code:
#include <stdio.h>
#include<string.h>
void  kiemtra(char *s)
{
int n=0;
sscanf(s,"%*[a-zA-z]%n",&n);
if(n==strlen(s))
printf("ok");
else
printf("du lieu nhap vao khong dung");
}
main()
{
char a[20];
printf("nhapten:");
gets(a);
kiemtra(&a);
}
Không biết cách này liệu đã ổn chưa anh Fal? ]]>
/hvaonline/posts/list/16321.html#99003 /hvaonline/posts/list/16321.html#99003 GMT
Re: [Thảo luận] Validate input data - C++ Code:
BOOL ReadInt(int *pIn)
{
    int c, sign;

    // Skip white space
    while (isspace(c = getchar()) && c != '\n')
        c = getchar();

    if (!isdigit(c) && c != '+' && c != '-')
        return FALSE;

    sign = (c == '-') ? -1 : 1;

    if (c == '+' || c == '-') {
        c = getchar();
        if (!isdigit(c))
            return FALSE;
    }

    for (*pIn = 0; isdigit(c); c = getchar())
        *pIn = 10 * *pIn + (c - '0');

    *pIn *= sign;

    return TRUE;
}
]]>
/hvaonline/posts/list/16321.html#99010 /hvaonline/posts/list/16321.html#99010 GMT
Re: [Thảo luận] Validate input data - C++

pearltran wrote:
Em mới học nên cũng không biết nhiều nếu có sai thì anh Fal và anh K4i bỏ qua nhé.Chương trình của em yêu cầu người dùng nhập tên Code:
#include <stdio.h>
#include<string.h>
void  kiemtra(char *s)
{
int n=0;
sscanf(s,"%*[a-zA-z]%n",&n);
if(n==strlen(s))
printf("ok");
else
printf("du lieu nhap vao khong dung");
}
main()
{
char a[20];
printf("nhapten:");
gets(a);
kiemtra(&a);
}
Không biết cách này liệu đã ổn chưa anh Fal?  
- Tớ nghĩ nếu chỉ là đọc tên thì ko có vấn đề gì. Nhưng mà include cả string.h, sử dung strlen(),.. thì thà viết 1 hàm như hàm strlen() còn hơn :D

Anh Thangcuem wrote:
BOOL ReadInt(int *pIn) { int c, sign; // Skip white space while (isspace(c = getchar()) && c != '\n') c = getchar(); if (!isdigit(c) && c != '+' && c != '-') return FALSE; sign = (c == '-') ? -1 : 1; if (c == '+' || c == '-') { c = getchar(); if (!isdigit(c)) return FALSE; } for (*pIn = 0; isdigit(c); c = getchar()) *pIn = 10 * *pIn + (c - '0'); *pIn *= sign; return TRUE; } 
:D Em đọc đoạn code mấy bữa nay rồi, nhưng muốn thấm rõ hơn nên chưa reply, đúng là ngắn gọn và Rock lắm anh. Thanks anh! Mong anh Thangcuem đóng góp cho box lập trình sôi nổi hơn nữa. ]]>
/hvaonline/posts/list/16321.html#99251 /hvaonline/posts/list/16321.html#99251 GMT
Re: [Thảo luận] Validate input data - C++ /hvaonline/posts/list/16321.html#99389 /hvaonline/posts/list/16321.html#99389 GMT Validate input data - C++ /hvaonline/posts/list/16321.html#184919 /hvaonline/posts/list/16321.html#184919 GMT