01/10/2018, 09:57

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;
}
Lone viết 12:11 ngày 01/10/2018

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.

Huy Nguyen viết 12:10 ngày 01/10/2018

Mình đã updated rồi đó bạn. bạn xem giúp mình với

Lone viết 12:02 ngày 01/10/2018

mình thấy vẫn thế ?
đưa đề bài và toàn bộ chương trình lên đi bạn

Huy Nguyen viết 12:10 ngày 01/10/2018

Rồi đó bạn. Bạn xem giúp mình với . làm 2 ngày rồi không ra

Huy Nguyen viết 12:07 ngày 01/10/2018

heres20 too long vì những kí tự phía sau là khoảng trắng đó bạn

Lone viết 12:08 ngày 01/10/2018

mấy cái include vẫn bị thiếu kìa bạn

Huy Nguyen viết 12:05 ngày 01/10/2018

Đầ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

HK boy viết 12:13 ngày 01/10/2018

Thêm 3 dấu ` vào đầu vào cuối code nhé.

Huy Nguyen viết 11:58 ngày 01/10/2018

bạn xem giúp code của mình với

HK boy viết 12:03 ngày 01/10/2018

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.

Huy Nguyen viết 12:06 ngày 01/10/2018

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.

HK boy viết 12:04 ngày 01/10/2018

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

Lone viết 11:59 ngày 01/10/2018
  • bạn dùng compiler nào vậy ? mình chưa từng thấy ai định nghĩa hàm ở trong hàm main cả, mình dùng compliler g++ thì nó không cho phép định nghĩa hàm như vậy
  • hàm isdigit có sẵn trong thư viện ctype.h, hàm fflush có trong conio.h bạn không việc gì phải định nghĩa lại.
  • tại thời điểm bạn gán kí tự cuối là \0 nghĩa là bạn đã thay đổi cái string vì lúc đấy dữ liệu đã được đọc và lưu và biến str xong rồi chứ không phải là làm như thế thì nó sẽ không đọc nữa. vì nếu nó chưa đọc xong thì str[strlen(str)-1] đã tồn tại đâu mà gán.
  • hàm fgets nó sẽ đọc cho đến khi nào đủ kí tự hoặc khi gặp kí tự xuống dòng hoặc eof. tuy vậy ký tự xuống dòng vẫn sẽ được lưu vào str sau đó null teminator sẽ được gán vào cuối str. để hiểu rõ hơn cách hoạt động của hàm này bạn tham khảo http://www.cplusplus.com/reference/cstdio/fgets/
Bài liên quan
0