View difference between Paste ID: mTV4Dch0 and TZLh6Pqs
SHOW: | | - or go back to the newest paste.
1
#include <stdio.h>
2
#include <string.h>
3
#include <malloc.h>
4-
// This fails if str isn't correctly terminated
4+
5
/*  This fails if str isn't correctly terminated */
6
int nums1(const char *str, size_t unused) {
7
	char *a;
8
	a = (char *)str;
9
	int num = 0;
10
11
	printf("%x: ", a);
12
	if(!str) return num;
13
	while(*a) {
14
		if(*a == ',') num++;
15
		printf("(%c) %x ", *a, a);
16
		a++;
17
	}
18
	printf("\n");
19
20
	return num;
21
}
22-
// This fails if str isn't correctly terminated
22+
23
/*  This fails if str isn't correctly terminated */
24
int nums2(const char *str, size_t unused) {
25
	int i;
26
	int num = 0;
27
	printf("%x: ", str);
28
	if(!str) return num;
29
	for(i = 0; i < strlen(str); i++) {
30
		printf("(%c) %x ", str[i], &str[i]);
31
		if(str[i] == ',') num++;
32
	}
33
	printf("\n");
34
35
	return num;
36
}
37-
// likely the safest assuming a correct len is passed in
37+
38
/*  likely the safest assuming a correct len is passed in */
39
int nums3(const char *str, size_t len) {
40
	int i;
41
	int num = 0;
42
43
	printf("%x: ", str);
44
45
	if(!str) return num;
46
47
	for(i = 0; i < strnlen(str, len); i++) {
48
		printf("(%c) %x ", str[i], &str[i]);
49
		if(str[i] == ',') num++;
50
	}
51
	printf("\n");
52
53
	return num;
54
}
55-
// I'm not so sure @koorogi
55+
56
/*  I'm not so sure @koorogi */
57
int nums4(const char *str, size_t len) {
58
	int num = 0;
59
60
	printf("%x: ", str);
61
	if(!str) return num;
62
63
	const char *a = strchr(str, ',');
64-
		// Print the whole string of what's left
64+
65
		/* Print the whole string of what's left */
66
		printf("(%s) %x ", a, a);
67
		a = strchr(a + 1, ',');
68
		num++;
69
	}
70
	printf("\n");
71
72
	return num;
73
}
74
75
#define nums(x, y) nums4(x, y)
76
#define STRSIZE 9
77
78
int main(int argc, char *argv[]) {
79
	printf("%d\n", nums("", 0));
80
	printf("%d\n", nums("5, 10", 6));
81
82
	char str1[] = "5, 10";
83
	printf("%d\n", nums(str1, strlen(str1)));
84-
	char *str2 = "5, 10";
84+
85
	const char *str2 = "5, 10";
86
	printf("%d\n", nums(str2, strlen(str2)));
87
88-
	// Overflow str3 by 1
88+
89
	/* Overflow str3 by 1 */
90
	int i;
91
	for(i = 0; i <= STRSIZE; i++)
92
		str3[i] = 0x61;
93
	printf("%d\n", nums(str3, STRSIZE));
94-
	// Overflow str4 by 1 after "5, 10"
94+
95
	char str4[STRSIZE] = "5, 10";
96
	/* Overflow str4 by 1 after "5, 10" */
97
	for(i = 5; i <= STRSIZE; i++)
98
		str4[i] = 0x61;
99-
	// Never trust the user...
99+
100
101
	/*  Not terminated */
102
	char str5[STRSIZE] = "012345678";
103
	printf("%d\n", nums(str5, STRSIZE));
104
105
	/* Never trust the user... */
106
	printf("%d\n", nums(NULL, 0));
107
108
	return 0;
109
}