Skip to content

Commit 52553f1

Browse files
committed
1. malloc了最大的数组,但没有完全free 2. size_t和int直接比较大小 3. 没有判断malloc是否成功 4. 变量声明统一放函数开始,兼容c99以前的标准 5. 变量和常量进行==比较时常量放前面 6. 用snprintf代替strncpy
1 parent 46ae0fa commit 52553f1

File tree

1 file changed

+21
-12
lines changed

1 file changed

+21
-12
lines changed

c/http_parser/split_by_blank.c

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,16 @@ struct string_array {
1313

1414
void
1515
init_string_array(struct string_array * arr) {
16-
arr -> length = 0;
1716
int i;
17+
char * temp = NULL;
18+
19+
arr -> length = 0;
1820
for (i = 0; i < MAX_ARRAY_LENGTH; i++) {
19-
char * temp = (char*)malloc(MAX_STRING_LENGTH + 1);
21+
temp = (char*)malloc(MAX_STRING_LENGTH + 1);
22+
if (NULL == temp) {
23+
printf("malloc error\n");
24+
exit(1);
25+
}
2026
memset(temp, 0, MAX_STRING_LENGTH + 1);
2127
arr -> array[i] = temp;
2228
}
@@ -25,40 +31,42 @@ init_string_array(struct string_array * arr) {
2531
void
2632
destory_string_array(struct string_array * arr){
2733
int i;
28-
for (i = 0; i < arr -> length; i++) {
34+
35+
for (i = 0; i < MAX_ARRAY_LENGTH; i++) {
2936
free(arr -> array[i]);
3037
}
3138
}
3239

3340
void
3441
print_string_array(struct string_array * arr){
3542
int i;
43+
3644
for (i = 0; i < arr -> length; i++) {
3745
printf("%d-%s\n", i, arr -> array[i]);
3846
}
3947
}
4048

4149
void
4250
split_by_blank(char * input, struct string_array * arr) {
43-
int scan_index = 0, current_len = 0;
44-
size_t len_input = strlen(input);
45-
char ch, *p = input;
51+
int scan_index = 0;
52+
size_t len_input = strlen(input), current_len = 0, copy_length;
53+
char ch, *p = input, *dst;
4654

4755
while ((ch = *(input++)) != '\0') {
4856
scan_index++;
4957
current_len++;
50-
if (ch == ' ' || scan_index == len_input) {
51-
if (arr -> length == MAX_ARRAY_LENGTH) {
58+
if (' ' == ch || scan_index == len_input) {
59+
if (MAX_ARRAY_LENGTH == arr -> length) {
5260
printf("array length over flow\n");
5361
exit(1);
5462
}
55-
char * dst = arr -> array[(arr -> length)++];
63+
dst = arr -> array[(arr -> length)++];
5664

57-
size_t copy_length = scan_index == len_input ? current_len : current_len - 1;
65+
copy_length = scan_index == len_input ? current_len : current_len - 1;
5866
if (copy_length > MAX_STRING_LENGTH)
5967
copy_length = MAX_ARRAY_LENGTH;
6068

61-
strncpy(dst, p, copy_length);
69+
snprintf(dst, copy_length, "%s", p);
6270

6371
printf("debug1:scan_index=%d arr.length=%ld dst=%s p=%s\n", scan_index, arr -> length, dst, p);
6472

@@ -70,14 +78,15 @@ split_by_blank(char * input, struct string_array * arr) {
7078

7179
int
7280
main(int argc, char ** argv) {
81+
struct string_array arr;
82+
7383
if (argc !=2){
7484
printf("Usage: split_by_blank \"POST / HTTP/1.0\"\n");
7585
return 1;
7686
}
7787

7888
printf("%s\n", argv[1]);
7989

80-
struct string_array arr;
8190
init_string_array(&arr);
8291

8392
split_by_blank(argv[1], &arr);

0 commit comments

Comments
 (0)