Làm sao xóa buffer hay giải quyết hiện tượng trôi lệnh
Đề bài là nếu người dùng nhập quá 2 tokens hay chiều dài chuỗi quá 20 kí tự thì thông báo lỗi và quay về nhập lại. Nếu nhập đúng thì xét tokens. Nếu token là số thì in ra “INT” hay chuỗi thì in ra “STR”. Nếu người dùng nhập vào “quit” thì thoát khỏi chương trình.
Đây là test của mình. Mình bị lỗi nếu người dùng nhập vào kí tự khoảng trắng nhiều lần
one two three
ERROR! Incorrect number of tokens found.
ERROR! Incorrect number of tokens found.
becareful of spaces at end of the line
ERROR! Input string too long.
heres 3
STR INT
heres 20
ERROR! Input string too long.
12345678901234567890
ERROR! Input string too long.
123456789012345678901
ERROR! Input string too long.
1
qUit
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <strings.h>
int is_digit(char);
void stdin_flush();
int main ()
{
printf("Assignment #1-4, Huy Nguyen, huynguyen2412@gmail.com
");
int is_digit(char *a){
int isDigit = 0;
int i = 0;
while (i < strlen(a) && isDigit == 0){
if (a[i] >= '0' && a[i] <= '9')
isDigit = 0;
else
isDigit = 1;
i++;
}
return isDigit;
}
void stdin_flush(){
int c;
while ((c = getchar()) != '
' && c != EOF) {};
}
char str[256];
char *ptr;
char *ptr2;
char **b = (char **)malloc(256*sizeof(char));
char *p;
int count =0;
int index;
int j =0;
int num_space;
do{
do{
count = 0;
index = 0;
num_space = -1;
//stdin_flush();
printf("> ");
fgets(str,66,stdin);
if (strlen(str)>20){
printf("ERROR! Input string too long.
");
continue;
}
str[strlen(str)-1] = ' ';
ptr = str;
while (*ptr != ' '){
if (*ptr == ' '){
num_space++;
}
ptr++;
}
p = strtok(str," ");
while (p != NULL){
b[index] = p;
count++;
index++;
p = strtok(NULL," ");
}
if (count > 2 || count <= 0){
printf("ERROR! Incorrect number of tokens found.
");
}
ptr = str;
}while(count > 2 || count <= 0);
while (j < index){
if (is_digit(b[j]) == 0)
printf("INT ");
else
printf("STR ");
j++;
}
printf("
");
}while(strcasecmp(str,"quit"));
return 0;
}
bạn nên đưa cả code và đề bài lên. vừa đọc vừa suy luận thế này rất khó cho người trả lời. ví dụ như j là gì ? b là gì ? tại sao heres 20 lại too long trong khi 12345678901234567890 thì không ? tại sao lại gán str[strlen(str)-1] = ‘\0’ ? tại sao nhiều chỗ bạn không dùng vòng for cho dễ hiểu như chỗ duyệt từng phần tử để tìm space bạn cho nó chạy từ vị trí 0 đến strlen-1 mà phải dùng con trỏ ? không có toàn bộ code và đề mình cũng không thể chạy thử xem có đúng là bạn gặp lỗi do trôi lệnh hay không.
Mình đã updated rồi đó bạn. bạn xem giúp mình với
mình thấy vẫn thế ?
đưa đề bài và toàn bộ chương trình lên đi bạn
Rồi đó bạn. Bạn xem giúp mình với . làm 2 ngày rồi không ra
heres20 too long vì những kí tự phía sau là khoảng trắng đó bạn
mấy cái include vẫn bị thiếu kìa bạn
Đầy đủ rồi dó bạn. Mình bỏ vào quote thì nó biến mất. ko biết sửa làm sao
Thêm 3 dấu ` vào đầu vào cuối code nhé.
bạn xem giúp code của mình với
Nếu bạn nhập
here 20
mà có nhiều dấu cách thừa ở sau thì trước khi xét độ dài > 20 thì bạn loại bỏ hết dấu cách vô nghĩa đi.Làm sao bỏ hết dấu cách đó đi được vậy bạn. Vì mình nghĩ mình bỏ kí tự NULL vào cuối chuỗi heres 20 \0 thì buffer sẽ không đọc được nữa.
Chả hiểu sao…
Vẫn gets xâu từ input, nhưng tạo một xâu
tmp
khác để lưu lại các kí tự chữ, số và những dấu cách có nghĩa. Chỉ xét xâu tmp này thôi.Đó là cách để chống trôi mà hiệu quả và an toàn. Mình sợ đọc nửa chừng rồi fflush sẽ gây ra biến cố cho code của bạn