30/09/2018, 17:36

Chương trình C++ gặp lỗi SIGSEGV khi submit bài giải lên spoj server?

Đây là link đề :

spoj.com

SPOJ.com - Problem P153SUMA

...


Và đây là code của em
Ideone.com

Ideone.com

Ideone is something more than a pastebin; it's an online compiler and debugging tool which allows to compile and run code online in more than 40 programming languages.

#include<stdio.h>
#include<string.h>
char s[1000000],t[1000000];
int strin()
{
    int i,j,vt;
    for (i=0; i<=strlen(s)-strlen(t); i++)
    {
        j=0,vt=i;
        while (s[vt]==t[j]&&j<strlen(t))
        {
            vt++;
            j++;
        }
        if (j==strlen(t)) return i;
    }
    return -1;
}
void xoasau(int vt)
{
    char kq[1000000];
    int i,m=0;
    for (i=0; i<vt; i++)
        kq[m++]=s[i];
    for (i=vt+strlen(t); i<strlen(s); i++)
        kq[m++]=s[i];
    kq[m]='';
    strcpy(s,kq);
}
main()
{
    int vt;
    gets(s);
    gets(t);
    while ( strin()!=-1 &&strlen(s)>=strlen(t))
    {
        vt = strin();
        xoasau(vt);
    }
    puts(s);
}

Thử khá nhiểu test thấy nó đúng
cũng k hiểu liệu nó có tràn mảng ở đoạn nào mà lại lối SIG
Mọi người xem giúp lỗi SIG ngoài tràn mảng còn có thể là lỗi gì ạ?

Mai Anh Dũng viết 19:51 ngày 30/09/2018

Mọi người xem giúp lỗi SIG ngoài tràn mảng còn có thể là lỗi gì ạ?

Có khá nhiều nguyên nhân, @M2T có thể xem danh sách các lỗi ở đây.

en.wikipedia.org

Segmentation fault | Causes

The conditions under which segmentation violations occur and how they manifest themselves are specific to hardware and the operating system: different hardware raises different faults for given conditions, and different operating systems convert these to different signals that are passed on to processes. The proximate cause is a memory access violation, while the underlying cause is generally a software bug of some sort. Determining the root cause – debugging the bug – can be simple in some cases...

@M2T riêng về việc test ở tren máy dúng mà up lên server thì lại sai thì Đạt nghĩ là do cách input của server và cách input data ở máy của @M2T có sự khác biệt.

@M2T đọc lại input của server SPOJ nó cho dữ liệu vào như thế nào, có thể giải thuật không sai mà sai ở chỗ đọc input đấy.

*grab popcorn* viết 19:52 ngày 30/09/2018

Gặp lỗi đúng rồi
test:

onbatoonncaveon
onbatoonncaveo

là tạch ngay.
Do cái này nè while ( strin()!=-1 && strlen(s)>=strlen(t) ){
tức với test trên, kq cuối là thì len(s) = 1.
Bạn gọi hàm strin() trc nên nó sẽ bay vào hàm đó và múa lửa ở trõng. Mà s < t trừ nhau ra âm -> tạch
Để sửa thì bạn chỉ cần đảo ngược điều kiện lại while ( strlen(s)>=strlen(t) && strin()!=-1 ){ là ok ngay
Anyway, code bị TLE rồi nhé

minh tiến viết 19:39 ngày 30/09/2018

ồ, thanks
chưa thử đến cái test đó :3

Mai Anh Dũng viết 19:44 ngày 30/09/2018

@M2T test thử giải pháp của @drgnz, nếu thấy đúng thì nhớ bấm vào nút trên trả lời của @drgnz để chọn câu trả lời đúng nhé.

minh tiến viết 19:43 ngày 30/09/2018

@drgnz
không bị lỗi với test bạn nói
trong trường hợp trên thì
strin chạy và trả về gia trị bắt đầu xuất hiện xâu con
và vẫn thỏa mãn len(s)>len(t) vì hàm xoasau chưa dc thực hiện mà nó thực hiện ở trong vòng while cơ !
nên test kia vẫn ổn !
Bọn xem giúp xem, minh đang muốn xem cái lỗi SIG kia đã còn thuật toán sai nó sẽ báo Wrong Answer ngay !
Sao lại lại SIG là vấn đề mình đang thắc mắc !

*grab popcorn* viết 19:45 ngày 30/09/2018

lỗi đc bạn :?

Ideone.com

Ideone.com

Ideone is something more than a pastebin; it's an online compiler and debugging tool which allows to compile and run code online in more than 40 programming languages.


fixed (nộp bị TLE):
Ideone.com

Ideone.com

Ideone is something more than a pastebin; it's an online compiler and debugging tool which allows to compile and run code online in more than 40 programming languages.

Đây, khi bạn xóa xâu, sâu S chỉ còn n.
Nhưng vòng while chưa kết thúc. Nó quay lại, kiểm tra điều kiện tiếp tục. Thì lúc này s = n; len(s) = 1 đc hàm strin() sử dụng. Nên ghi len(s)-len(t) ra số âm mà có vẻ như nó auto chuyển thành số dương cực lớn. Nên mảng tràn.

minh tiến viết 19:44 ngày 30/09/2018


thế mà mình chạy trên geany lại ok chứ @@
hàm strin sử dụng nhưng nó sẽ return -1 vì k chứa xâu con nên nó sẽ thoát while chứ nhỉ??
Dù sao cũng rất cảm ơn bạn nhiệt tình xem giúp !!

*grab popcorn* viết 19:39 ngày 30/09/2018

@_@
what the what!
ideone chạy trên linux cùng nhau mà s ảo v trời :v

minh tiến viết 19:42 ngày 30/09/2018

thế pro có giải thuật nào khác AC k?

Hiếu Nguyễn viết 19:48 ngày 30/09/2018
Ideone.com

Ideone.com

Ideone is something more than a pastebin; it's an online compiler and debugging tool which allows to compile and run code online in more than 40 programming languages.

Sử dụng thuật toán string matching KMP…

Bài liên quan
0