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