我正在嘗試解決這個問題https://www.codewars.com/kata/55c6126177c9441a570000cc/train/c。我在 ubuntu 18.04 上使用相同的編譯器(clang-8)檢查了這個程式,一切正常,valgrind 也沒有顯示任何記憶體泄漏或無效讀/寫。但是,當我在代碼戰上按下嘗試時,它顯示所有測驗都已成功通過,但隨后顯示:“測驗崩潰捕獲意外信號:SIGSEGV (11)。無效的記憶體訪問。” 我知道我還能做些什么來解決這個問題,它有很好的評價和很多解決方案,但由于某種原因它根本不適合我。這是完整的代碼:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
size_t cap;
double rate;
size_t cnt;
char** list;
size_t* len;
size_t* sum;
} w_list;
void wl_const(w_list* l)
{
l->cap = 10; l->rate = 2.0; l->cnt = 0;
l->list = calloc(l->cap, sizeof(char*));
l->len = calloc(l->cap, sizeof(size_t));
l->sum = calloc(l->cap, sizeof(size_t));
}
void wl_dest(w_list* l)
{
for (size_t i = 0; i < l->cnt; i )
free(l->list[i]);
free(l->list); l->list = NULL;
free(l->len); l->len = NULL;
free(l->sum); l->sum = NULL;
}
void wl_add(w_list* l, char* wgt)
{
if (l->cnt == l->cap)
{
l->list = realloc(l->list, l->cap *= l->rate);
l->len = realloc(l->len, l->cap *= l->rate);
l->sum = realloc(l->sum, l->cap *= l->rate);
}
//add len
l->len[l->cnt] = strlen(wgt);
//add weight
l->list[l->cnt] = calloc(strlen(wgt) 1, sizeof(char));
strcpy(l->list[l->cnt], wgt);
//add sum
for (size_t j = 0; j < l->len[l->cnt]; j )
l->sum[l->cnt] = (size_t)(l->list[l->cnt][j] - '0');
l->cnt ;
}
void swap_lu(size_t* a, size_t* b)
{
size_t temp = *a;
*a = *b;
*b = temp;
}
void swap_str(char** a, char** b)
{
char* temp = *a;
*a = *b;
*b = temp;
}
void bubble_sort(w_list* l)
{
size_t* list = l->sum;
size_t n = l->cnt;
for (size_t i = 0; i < n-1; i )
{
for (size_t j = 0; j < n-i-1; j )
{
if (list[j] > list[j 1])
{
swap_lu(&list[j], &list[j 1]);
swap_str( &l->list[j], &l->list[j 1] );
}
else if (list[j] == list[j 1])
{
int cmp = strcmp(l->list[j], l->list[j 1]);
if (cmp > 0)
{
swap_lu(&list[j], &list[j 1]);
swap_str( &l->list[j], &l->list[j 1] );
}
}
}
}
}
void wl_print_sum(w_list l)
{
for (size_t i = 0; i < l.cnt; i )
{
printf("%zu ", l.sum[i]);
}
printf("\n");
}
void wl_print_list(w_list l)
{
for (size_t i = 0; i < l.cnt; i )
{
printf("%s ", l.list[i]);
}
printf("\n");
}
char* get_res(w_list l)
{
size_t len_sum = 0;
for (size_t i = 0; i < l.cnt; i )
len_sum = l.len[i] 1;
char* res = calloc(len_sum, sizeof(char));
for (size_t i = 0; i < l.cnt-1; i )
{
strcat(res, l.list[i]);
res[strlen(res)] = '\0';
strcat(res, " ");
}
strcat(res, l.list[l.cnt-1]);
res[strlen(res)] = '\0';
printf("len_sum = %zu, act_len = %zu\n", len_sum, strlen(res) 1);
return res;
}
char* orderWeight(const char* s)
{
char* ss = calloc(strlen(s) 1, sizeof(char));
ss = strcpy(ss, s);
w_list l; wl_const(&l);
printf("A---------\n");
for ( char* tk = strtok(ss, " "); tk; tk = strtok(NULL, " ") )
{
printf("tk : %s\n", tk);
wl_add(&l, tk);
printf("l : %s\n", l.list[l.cnt-1]);
}
printf("Before sort---------\n");
wl_print_sum(l);
wl_print_list(l);
bubble_sort(&l);
printf("After sort---------\n");
wl_print_sum(l);
wl_print_list(l);
//char* res_t = calloc(1,1);
char* res = get_res(l);
printf("res: %s\n", res);
free(ss); ss = NULL;
wl_dest(&l);
return res;
//return res_t;
}
void dotest(const char* str, char* ans)
{
char* res = orderWeight(str);
if ( !strcmp(res, ans) )
printf("SUCCESS\n");
free(res); res = NULL;
}
int main(void)
{
dotest((const char*)"103 123 4444 99 2000", "2000 103 123 4444 99");
dotest((const char*)"2000 10003 1234000 44444444 9999 11 11 22 123", "11 11 2000 10003 22 123 1234000 44444444 9999");
dotest((const char*)"10003 1234000 44444444 9999 2000 123456789", "2000 10003 1234000 44444444 9999 123456789");
return 0;
}
這是程式的輸出:
A---------
tk : 103
l : 103
tk : 123
l : 123
tk : 4444
l : 4444
tk : 99
l : 99
tk : 2000
l : 2000
Before sort---------
4 6 16 18 2
103 123 4444 99 2000
After sort---------
2 4 6 16 18
2000 103 123 4444 99
len_sum = 21, act_len = 21
res: 2000 103 123 4444 99
SUCCESS
A---------
tk : 2000
l : 2000
tk : 10003
l : 10003
tk : 1234000
l : 1234000
tk : 44444444
l : 44444444
tk : 9999
l : 9999
tk : 11
l : 11
tk : 11
l : 11
tk : 22
l : 22
tk : 123
l : 123
Before sort---------
2 4 10 32 36 2 2 4 6
2000 10003 1234000 44444444 9999 11 11 22 123
After sort---------
2 2 2 4 4 6 10 32 36
11 11 2000 10003 22 123 1234000 44444444 9999
len_sum = 46, act_len = 46
res: 11 11 2000 10003 22 123 1234000 44444444 9999
SUCCESS
A---------
tk : 10003
l : 10003
tk : 1234000
l : 1234000
tk : 44444444
l : 44444444
tk : 9999
l : 9999
tk : 2000
l : 2000
tk : 123456789
l : 123456789
Before sort---------
4 10 32 36 2 45
10003 1234000 44444444 9999 2000 123456789
After sort---------
2 4 10 32 36 45
2000 10003 1234000 44444444 9999 123456789
len_sum = 43, act_len = 43
res: 2000 10003 1234000 44444444 9999 123456789
SUCCESS
現場輸出圖片
uj5u.com熱心網友回復:
通過插入這兩行
static unsigned int count = 0;
fprintf(stderr, "%u: %s\n", count , s);
在開始 og 函式orderWeight時,我得到這個輸出stderr
0: 103 123 4444 99 2000
1: 2000 10003 1234000 44444444 9999 11 11 22 123
2: 10003 1234000 44444444 9999 2000 123456789
3: 3 16 9 38 95 1131268 49455 347464 59544965313 496636983114762 85246814996697
我假設前三個輸入字串對應于三個“測驗通過”訊息和崩潰的第四個輸入。
據我了解代碼,該行
l->cap = 10;
in 函式wl_const將輸入值的數量限制為 10。
我建議從輸入字串中的空格數 1 來計算這個值。
作為快速修復,我將限制更改為l->cap = 100;并找到了這些測驗輸入字串:
0: 103 123 4444 99 2000
1: 2000 10003 1234000 44444444 9999 11 11 22 123
2: 10003 1234000 44444444 9999 2000 123456789
3: 3 16 9 38 95 1131268 49455 347464 59544965313 496636983114762 85246814996697
4: 71899703 200 6 91 425 4 67407 7 96488 6 4 2 7 31064 9 7920 1 34608557 27 72 18 81
5: 387087 176 351832 100 430372 8 58052 54 175432 120 269974 147 309754 91 404858 67 271476 164 295747 111 40
6: 13538 625 102 6986 14449 13233 2347 9239 12995 15637 7462 4757 8792 18878 11655 15413 6132 5858 18575
7: 11567 19444 10327 10963 3540 287 14288 3422 19868 15561 13831 15478 16176 13923 4537 12697 7156
8: 1936 2223 6656 11460 9043 17510 10339 698 12923 16461 8618 13571 17310 2257 13015 9709
9: 18617 12059 9571 2039 13999 7204 17932 9477 3380 13927 16076
10: 1083 5023 75 5368 11669 11526 14401 9179 3937 17162 4175 2470 7852 17736 19770 10100 12823
11: 5383 11440 1538 17016 15541 15527 4221 15545 7077 9663 9472 5225 7803 12617 12310 7868 17975 3979 1466
12: 15221 7465 13683 1468 9925 1535 19194 9695 13697 12017 1247 19070 5529 4847 16087 3142 2447 2380 18677
13: 12033 8149 16801 19826 2838 9112 9767 813 15153 13295 17324 12446 761 13079 13904 10676
14: 13098 2444 10374 7187 3681 9445 14778 8518 7604 17910 10955 9974 18659 2541 4079
15: 1415 5978 11708 10517 15735 14584 7742 11102 11908 189
16: 4988 14083 2530 1665 9254 7036 12029 18503 10707 3546 13282 1297 13212
17: 12243 5258 13996 16846 9328 2876 333 15296 14575 10840 13103 9159 18573 4205
18: 834 18121 10189 14907 2723 11844 6233 9749 5946 4737 456 11554 91 1743 4767 15417 16048 12087 9413
19: 1415 14352 15290 18773 10999 8203 13948 2230 8848 18144 5359 9672 16265 15539 4579 18978 9455
20: 10799 17463 17602 11245 9018 19755 15050 15847 15172 13171 7934 6658 10210 11412 3082
21: 10185 14071 15765 4134 16291 4613 4350 1650 16347 2687 19251 927
22: 8707 15864 14526 8242 15538 7843 17250 15293 4965 15169 12537 18126 3104 1267 10408 16578 4339
23: 6763 18400 13736 12959 14691 422 19371 18404 16759 4130 17655
24: 7857 8434 15612 4455 16667 11150 14360 15989 8515 19316 13231 1053 19514 16325 2310 9923 12903 6640
25: 1738 5040 3702 16760 1804 6186 16131 208 2946 2334 19925 4766 10181 8360
26: 16699 7099 13591 11059 5160 2107 12447 18381 5222 11962 16778 7522 3957 11753 16224 13913 13482 3337 17605
27: 5131 3792 10517 7401 8800 12841 7326 13556 5095 17748 15997 1794 6919 9589
28: 12070 13758 9435 10451 18970 1397 7230 8564 7416 1055 6861 1329 16599 10188 1006
29: 17381 6860 19421 6854 15650 14334 14170 9207 19419 13991 7276 3285 910
30: 18191 12970 12685 7626 5494 13727 11085 14786 4364 573 15831 11215 3964 12431 3475 4960 1344
31: 11811 2837 9772 9533 17162 3942 812 16581 19995 8079 19857 906 7006 130 13866 1764 9818 1432
32: 2975 16208 1917 3538 12040 15194 7492 4471 18659 14514 7877
33: 6325 10705 11349 17921 7867 17354 18723 6520 17349 6802 8449 18245 15871 8569 14184 17625 459
34: 15178 3424 13887 17086 9024 5927 12280 18578 12460 13012 13093 337 14589 1490 13104 8011
35: 3043 7437 18125 9554 4786 6999 75 5104 2870 8635 1360
36: 11156 19028 17736 14571 12915 14822 5667 914 9174 4246 13364 2186 19401 15764 16766
37: 8868 6849 293 13974 14276 490 5600 1134 7479 5665 6228
38: 14290 9650 12897 5447 8679 10633 2090 1594 7527 9819
39: 16692 14055 17925 18868 13456 13689 17706 16410 4630 6627 16693
40: 903 19245 6266 2028 6724 11921 10318 19126 8284 19959 12024 15793 10710 4729 17873 14366
41: 7692 18927 8939 3820 18925 9879 19338 12614 9658 15748 19306 16275 14513 19972 17169 13758 8310
42: 483 232 13649 1681 8506 15680 13695 4299 6390 18415 4244 2829 12734 11926 1756 3745 17808 681 13614
43: 15358 3272 14967 16736 19538 9481 18781 18779 3239 7091 48 5784 7313 15759 7456 15809 11440
44: 2180 19892 3710 6414 2721 16434 413 4468 179 18211 7211 15856 17430
45: 19118 12398 1378 738 1879 159 19507 7180 7240 1627 12955 16616 19449 2483 14497 10889 5696 16668 12853
46: 3082 15565 7903 3485 2105 8073 3769 9306 6001 3271 13938 7191 15659 15306 7920 19600 17527
47: 8853 4767 13189 3880 3455 14710 6353 17943 5599 12039 14611 524 3508 19755 16079 11402 5313 256 1547
48: 9553 9610 14405 5563 16791 12137 2941 6783 11737 468 16273 2662 7297 11534
49: 10743 6244 12875 10758 13905 6987 7441 14419 12557 7196 12571 6031
50: 12817 9640 5715 4442 19240 121 9995 16032 12248 14998 2815 6057 17528 1160 8710 4826 14756 17304 17631
51: 10180 8389 16967 19229 17892 13459 11786 5088 6030 17808
52: 18837 7448 5365 5352 8761 7548 17409 4793 19786 12408
53: 7916 9936 12893 18688 16824 7649 15992 14455 10712 8244
54: 7679 7473 2808 1138 1332 9959 9230 1212 9609 8068 8650 17036 15482 19473 4585 12891
55: 6443 5299 15999 14349 15226 8892 15109 14122 18603 11102 8578 9315 19336 15556 19057 8882 437 2267
56: 10386 11488 11406 2067 1628 2128 19093 17100 1602 5750 9991 7930 12184 17353
57: 8605 14651 16955 3715 8773 15559 14807 19413 6946 16215 14970
58: 5097 17469 10333 15291 7855 3893 6697 11984 5511 10888 13149 4683 12480 18890 16736
59: 13146 14089 8474 3823 8740 5429 7528 19576 3060 4407 18989 9997
60: 16031 18062 7782 13500 10467 5146 3427 14350 13905 15401 19851 4793 8551 6606 19335
61: 3343 1818 4731 17422 10282 8544 8235 17773 16063 7811 834 2542 8872
62: 5227 4904 10955 15072 18394 1423 218 1822 17835 14113 17213
63: 979 7836 6365 314 19411 9698 2122 4142 9193 14466 12677 19490 12240 10812 7301 13064 13344 16163 5957
64: 3139 18974 15706 1534 2469 15914 5418 305 12099 4703 64 13068 12530 6419
65: 14013 18180 17557 228 9445 12024 12895 8935 6336 5779 18298 19390 1195 16533 7419
66: 19663 6393 19597 1197 8853 15511 8677 9148 9683 13370 9202 2751 7972 17683 18186 1986 17935 17816 2204
67: 11912 17161 16305 18238 2940 14603 17628 6197 11137 5047
68: 12872 13502 9686 16131 2355 5198 4808 11493 16943 18168 2767 1766 6141 2523 2025 10189 458 19831 12383
69: 13815 11616 4134 12053 14546 810 11753 2815 14009 18862 12894 6881 12364 2581 3012 14710 9841 7810 8275
70: 5978 13105 8540 14181 15618 10555 4370 16066 12458 18815 3895 6273 10431 10092
71: 7049 12964 12141 9855 6973 11003 2749 15916 5440 7392 18918 2222 17223 8800 10487 4007
72: 3592 14610 11022 19200 7237 17454 17339 19686 16270 1234
73: 6701 13388 6348 13741 8424 561 3596 17459 13627 8407 13375
74: 15790 14365 1279 13013 5237 11756 19083 2078 17411 15765 15162 18683 3002 12616 16022 2688 10958
75: 10710 17650 14779 19120 13463 3204 1753 19121 663 15370 7528 14029 14427 5390 10466 15696 476 15694 9525
76: 17762 6936 17386 14996 7691 388 9684 3714 5139 643 3033
77: 365 17802 19103 13818 3078 856 12939 3732 16217 2539 19823
78: 9992 10289 8413 12530 8055 10 14151 7889 9008 11537 2885 16689 13987 12560 2475 1198
79: 7570 1181 15620 7445 284 11510 10513 3203 6521 16307 1492 11122 16130 14198 1114
80: 4683 13634 16537 4683 7785 6499 15753 1394 9374 12443 17444 4006
81: 18632 1343 4551 19804 16953 11986 2160 8463 2499 5353
82: 18797 6835 8169 16999 3106 9273 5491 7779 4980 4101 14525 14827 10590 12350
83: 2036 6865 15728 8105 3846 16432 9438 8387 18308 8464 373 469
84: 4934 7884 16036 3731 16782 4205 731 19878 15540 8284 9729 520 14447 6326 15338 5037 749 13622 9136
85: 9350 19303 11440 7854 10813 1899 6163 1349 4334 8694 339 9259 16568 18437
86: 15422 2642 15773 17372 18172 6130 7102 765 577 15490 16093 7677
87: 11787 16803 5906 3209 18178 19408 11053 8991 1308 19278 10331 5632 7972 12732 16953 4541 11169 12006 2035
88: 7779 19398 16117 15971 8572 16872 16539 4062 15037 4216 2364 8896 3091
89: 12095 1269 9740 5221 12322 13110 4499 4725 18733 12462 19519 15686
90: 10688 7692 1100 8633 17534 498 6823 13505 9060 5767 12116 15185 805 16322 19611
91: 1485 9943 3859 4816 1755 9070 19201 14856 13559 3926 15661
92: 5518 13419 7158 18268 3184 10321 6902 718 10809 13715 16285 1942 19472
93: 17117 2349 8868 18800 14103 10344 10815 17952 17222 12560 9094 16423 7416 4725
94: 5149 12809 7930 18559 19957 6198 1743 10278 15162 4523 3160 10949
95: 5092 12494 13344 4281 14833 2213 3081 11008 14619 13886
96: 11841 8518 126 10337 17997 4842 12749 3146 17641 2751
97: 19670 11011 5510 12021 6174 10023 15171 19185 12894 2335 11679 8310 6606 6513 12585
98: 17511 7204 7707 8544 1118 16215 8660 11445 14212 15564 6266 19421 13205 9007 1126 14948 2090 6627 6969
99: 18712 4212 9512 13678 6537 1191 1989 15205 7694 14564 9026 7278 3841 16723 17884 4949
100: 8616 16384 11295 4181 4722 10716 19448 15791 13904 14396
101: 2603 1365 8198 1316 5567 17700 17056 12094 963 19035 9371
102: 15672 18387 17988 19503 17182 15872 6524 14265 6560 4980 5560 10731 9692 18338 10180 5483 12242 4576
103: 14836 8004 15686 18214 13561 15458 15270 7728 16412 16378 17089 7132 12050 17549 5120 13625
104: 3064 2221 11068 9614 7191 18690 2418 16873 17028 12588 4428 11343 19226
105: 8251 7230 7603 6465 792 3061 3807 10582 19463 185 9743 8667 14297 7292 13777 7922
uj5u.com熱心網友回復:
主要問題是我在重新分配時沒有將元素的數量分別乘以 sizeof(char*) 和 sizeof(size_t) 。在使用 = 之前,我也沒有將 l->sum[l->cnt] 初始化為零。所有問題都在 wl_add 函式中。它應該是這樣的:
void wl_add(w_list* l, char* wgt)
{
if (l->cnt == l->cap)
{
l->list = realloc(l->list, (l->cap *= l->rate) * sizeof(char*));
l->len = realloc(l->len, (l->cap *= l->rate) * sizeof(size_t));
l->sum = realloc(l->sum, (l->cap *= l->rate) * sizeof(size_t));
}
//add len
l->len[l->cnt] = strlen(wgt);
//add weight
l->list[l->cnt] = calloc(strlen(wgt) 1, sizeof(char));
strcpy(l->list[l->cnt], wgt);
//add sum
l->sum[l->cnt] = 0;
for (size_t j = 0; j < l->len[l->cnt]; j )
l->sum[l->cnt] = (size_t)(l->list[l->cnt][j] - '0');
l->cnt ;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/418896.html
標籤:
上一篇:提取引號內的物件型別
