8
8
#include <stdlib.h>
9
9
#include <string.h>
10
10
11
- char * HACKERRANK_WARMUP_firstN (const char * s , unsigned long n ) {
12
- unsigned long len = strlen (s );
13
- if (n > len ) {
14
- return NULL ;
15
- }
16
- if (n == 0 ) {
17
- return NULL ;
18
- }
11
+ #define HACKERRANK_WARMUP_LONG_TIME_FORMAT_SIZE 10
12
+ #define HACKERRANK_WARMUP_SHORT_TIME_FORMAT_SIZE 8
13
+ #define HACKERRANK_WARMUP_HOUR_FORMAT_SIZE 2
19
14
20
- char * result = ( char * ) malloc (( n + 1 ) * sizeof ( char ));
21
- if (result == NULL ) {
15
+ char * HACKERRANK_WARMUP_timeConversion ( const char * s ) {
16
+ if (s == NULL ) {
22
17
return NULL ;
23
18
}
24
19
25
- strncpy ( result , s , n );
20
+ size_t s_len = strnlen ( s , HACKERRANK_WARMUP_LONG_TIME_FORMAT_SIZE );
26
21
27
- result [n ] = '\0' ;
28
-
29
- return result ;
30
- }
31
-
32
- char * HACKERRANK_WARMUP_lastN (const char * s , unsigned long n ) {
33
- unsigned long len = strlen (s );
34
- if (n > len ) {
35
- return NULL ;
36
- }
37
- if (n == 0 ) {
22
+ if (s_len != HACKERRANK_WARMUP_LONG_TIME_FORMAT_SIZE ) {
38
23
return NULL ;
39
24
}
40
25
41
- char * result = (char * )malloc ((n + 1 ) * sizeof (char ));
42
- if (result == NULL ) {
43
- return NULL ;
44
- }
45
-
46
- strncpy (result , s + len - n , n );
26
+ char hour_str [HACKERRANK_WARMUP_HOUR_FORMAT_SIZE + 1 ];
47
27
48
- result [n ] = '\0' ;
49
-
50
- return result ;
51
- }
28
+ hour_str [0 ] = s [0 ];
29
+ hour_str [1 ] = s [1 ];
30
+ hour_str [2 ] = '\0' ;
52
31
53
- char * HACKERRANK_WARMUP_timeConversion (const char * s ) {
54
- char * meridian = HACKERRANK_WARMUP_lastN (s , 2 );
55
-
56
- char * hour_str = HACKERRANK_WARMUP_firstN (s , 2 );
57
- char * time_str = (char * )malloc ((strlen (s ) + 1 ) * sizeof (char ));
58
- if (time_str == NULL ) {
59
- free (hour_str );
60
- free (meridian );
61
- return NULL ;
62
- }
63
- strcpy (time_str , s );
64
- char * temp_time_str = HACKERRANK_WARMUP_lastN (time_str , strlen (time_str ) - 2 );
65
- free (time_str );
66
- time_str = temp_time_str ;
67
- temp_time_str = HACKERRANK_WARMUP_firstN (time_str , strlen (time_str ) - 2 );
68
- free (time_str );
69
- time_str = temp_time_str ;
32
+ char meridian [3 ];
33
+ meridian [0 ] = s [s_len - 2 ];
34
+ meridian [1 ] = s [s_len - 1 ];
35
+ meridian [2 ] = '\0' ;
70
36
71
37
char * endptr ;
72
38
long hour = strtol (hour_str , & endptr , 10 );
73
39
74
40
if (* endptr != '\0' ) {
75
41
printf ("Conversion error, non-convertible part: %s\n" , endptr );
76
42
77
- free (hour_str );
78
- free (meridian );
79
- free (time_str );
80
- free (endptr );
81
43
return NULL ;
82
44
} else {
83
45
printf ("The integer value is: %ld\n" , hour );
@@ -89,14 +51,15 @@ char *HACKERRANK_WARMUP_timeConversion(const char *s) {
89
51
hour += 12 ;
90
52
}
91
53
92
- const int BUFFER_MAX_SIZE = 9 ;
54
+ char * conversion =
55
+ malloc ((HACKERRANK_WARMUP_SHORT_TIME_FORMAT_SIZE + 1 ) * sizeof (char ));
56
+ strncpy (conversion , s , HACKERRANK_WARMUP_SHORT_TIME_FORMAT_SIZE );
57
+ conversion [HACKERRANK_WARMUP_SHORT_TIME_FORMAT_SIZE ] = '\0' ;
93
58
94
- char * conversion = malloc ( BUFFER_MAX_SIZE * sizeof ( char ) );
59
+ snprintf ( hour_str , HACKERRANK_WARMUP_HOUR_FORMAT_SIZE + 1 , "%02ld" , hour );
95
60
96
- snprintf (conversion , BUFFER_MAX_SIZE , "%02ld%s" , hour , time_str );
97
- free (hour_str );
98
- free (meridian );
99
- free (time_str );
61
+ conversion [0 ] = hour_str [0 ];
62
+ conversion [1 ] = hour_str [1 ];
100
63
101
64
return conversion ;
102
65
}
0 commit comments