Cách đếm số câu trong 1 string ở trường hợp đặc biệt

Điều kiện kết thúc câu là ‘!’, ‘?’, ‘.’
Ví dụ:
Câu có giai thừa " The result is 3! . " ( dựa vào điều kiện trên, đây sẽ có 2 câu ??? )
Câu kết thúc bằng chuỗi kí tự cảm thán " I love you!!! " ( 4 câu ???)
Câu có số thập phân "Pi is 3.14. " (2 câu ???)
Câu hỗn tập " what is the value of pi?! I am not sure, 3.14 right? " ví dụ này là 4 câu nếu xét theo điều kiện trên. Vậy ae cho mình hỏi làm sao có thể đếm số câu đúng mà vẫn dựa vào điều kiện trên. (chỉ được dùng pointer không dùng array)
Cảm ơn mọi người nhiều !!

Bạn phải rào điều kiện lại, sau dấu câu phải là khoảng trắng

Nhìn vào là thấy rồi:

  • Sau dấu kết thúc là khoảng trắng, kí tự ngăn (tab), xuống dòng hoặc kí tự rỗng (nul) = kết thúc chuỗi.
  • Các kí tự kết thúc câu nếu liền nhau thì đó là 1 câu. I love you!!!.
  • Dấu chấm (.) nếu dùng với số (trước và sau) thì đang biểu diễn số thực, chưa kết thúc câu, và chỉ duy nhất 1 dấu chấm, nếu có dấu thứ 2, nó có thể là kết thúc câu. Pi is 3.14..
  • Câu không rỗng. Trước dấu kết thúc mà chẳng có gì thì không xem là 1 câu. The result is 3! ..

Đó là xét 3 trường hợp bạn đưa ra, thực tế còn nhiều trường hợp phức tạp hơn nữa. Vd: @$!*%.(^£÷×?)*. thì xem là bao nhiêu câu??? :smiling_imp:

2 Likes
Trang
#include <stdio.h>
typedef void(*split_fn)(const char *, size_t, void *);
 
unsigned int split(const char *str, split_fn fun, void *data)
{
    
    unsigned int start = 0, stop;
    unsigned int count=0;
    for (stop = 0; str[stop]; stop++) {
          if ((str[stop] == '!') ||(str[stop] == '?') ||(str[stop] == '.' )) {
            fun(str + start, stop - start, data);
            start = stop + 1;
            count++;
        }
    }
    fun(str + start, stop - start, data);
    return (count+1);
}
void print(const char *str, size_t len, void *data)
{
    printf("%.*s\n", (int)len, str);
}
 
int main(void)
{
    unsigned int dem=0;
    char str[] = "first!!! ha?ha...kho?";
    dem=split(str, print, NULL);
    printf("%d\n", dem);
    return 0;
}
2 Likes

Thêm mấy số kiểu III.a III.b là thôi xong :smiley:

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?