Tách dãy số từ chuỗi

Bài viết này sẽ giúp các bạn tách dãy số từ chuỗi. Ví dụ với chuỗi

"-1.223 %^& fsf 0.234 56.65 fsf 9 f"

Chúng ta sẽ tách được ra các số:

-1.223
0.234
56.65
9
#include <string.h>
#include <stdlib.h>
#include <stdio.h>

int main(void)
{
    // khong doc duoc str khi bat dau bang dau tru (-)
    char* str= "-1.223 %^& fsf 0.234 56.65 fsf 9 f";

    // khai bao, cap phat bo nho them s de cong them vao dau 1 ky tu
    char* const s = (char*)malloc(sizeof(strlen(str))+1);

    // cong them ky tu a
    strcpy(s, "a");
    strcpy(s + strlen(s), str);
    printf("%s\n",s);

    // tach lay cac so
    int total_n = 0; 
    int n;    
    float i; // cac so can tach

    printf("\nday cac so\n");
    while (1 == sscanf(s + total_n, "%*[^0123456789-]%f%n", &i, &n))
    {
        total_n += n;
        printf("%f\n", i);
    }

    return 0;
}

Ngoài ra thi việc này làm dễ dàng bằng java, các bạn có thể xem thêm tại đây:
tách dãy số từ chuỗi

6 Likes

Cái này hay đấy Quân, cái này có vẻ ứng dụng trong thực tế được. Ứng dụng của nó là gì vậy?

3 Likes

anh có thể giải thích cách hoạt động của chương trình này được ko ạ ? Nhất lả ở chỗ điều kiện của vòng while, chỗ sscanf.

Em cũng chưa nghĩ ra nữa ứng dụng của nó là gì nữa :wink:

trong vòng while thực hiện duyệt tìm tất cả các “thành phần” bắt đầu bằng số hoặc dấu âm, khi tìm được thì đọc nó vào bién i, nói chung nó liên quan đến regex :wink: bạn có thể search thêm về nó.

1 Like

Hàm scanf.

#include <stdio.h>
int main()
{
    int a;
    float b, c, d;
    char cha[10], chb[10], chc[10], chd[10];
    printf("\n Nhap dong vao: -1.223 %%^& fsf 0.234 56.65 fsf 9 f\n\n ");
    scanf("%6f %3s %3s %5f %5f %3s %d %1s", &b, cha, chb, &c, &d, chc, &a, chd);
    printf("\n %2.3f\n %1.3f\n %2.2f\n %d\n", b, c, d, a);
    return 0;
}

Hàm scanf phân biệt dữ liệu khác nhau bằng khoảng cách trắng. Dòng vào: “-1.223 %^& fsf 0.234 56.65 fsf 9 f” có 8 dữ liệu, tương ứng 8 biến. Hàm scanf đọc dòng vào với 8 dữ liệu và gán cho 8 địa chỉ tương ứng. Tham số d…d tương ứng trên dòng vào là: 6, 3, 3, 5, 5, 3, 1, 1

#include <stdio.h>
int main()
{
    int a;
    float b, c, d;
    printf("\n Nhap dong vao: -1.223 %%^& fsf 0.234 56.65 fsf 9 f\n\n ");
    scanf("%6f %*s %*s %5f %5f %*s %d %*s", &b, &c, &d, &a);
    printf("\n %2.3f\n %1.3f\n %2.2f\n %d\n", b, c, d, a);
    return 0;
}

% * s Các ký tự trên dòng vào được đọc bình thường nhưng không gán cho các địa chỉ tương ứng, không có đối tương ứng.

#include <stdio.h>
int main()
{
    int a;
    float b, c, d;
    char cha[10], chb[10], chc[10], chd[10];
    printf("\n Nhap dong vao: -1.223 %%^& fsf 0.234 56.65 fsf 9 f\n\n ");
    scanf("%6f %[^0123456789 ] %[^0123456789] %5f %5f %[^0123456789] %d %s", &b, cha, chb, &c, &d, chc, &a, chd);
    printf("\n %2.3f\n %1.3f\n %2.2f\n %d\n", b, c, d, a);
    return 0;
}

%[^0123456789] Các ký tự trên dòng vào sẽ lần lượt được đọc cho đến khi nào gặp một ký tự không thuộc tập các ký tự đặt trong [ ].
%[^0123456789 ] Tương tự như trên.

%[^0123456789] Không đọc ký tự số từ 0 … 9
%[^0123456789 ] Có một khoảng cách trắng. Không đọc ký tự số từ 0 … 9 và ký tự chữ từ a … z

2 Likes

I moved a post to a new topic: Tách các số trong mảng mà không dùng vòng lặp for?

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