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 - Problem P153SUMA
...
Và đây là code của em
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ì ạ?
Bài liên quan
Có khá nhiều nguyên nhân, @M2T có thể xem danh sách các lỗi ở đây.
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.
Gặp lỗi đúng rồi
test:
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 ngayAnyway, code bị TLE rồi nhé
ồ, thanks
chưa thử đến cái test đó :3
@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é.
@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 !
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 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.
ồ
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 !!
@_@
what the what!
ideone chạy trên linux cùng nhau mà s ảo v trời :v
thế pro có giải thuật nào khác AC k?
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…