Last active
October 11, 2018 23:45
-
-
Save sr105/fa031a0985ff773514700aab33619c0a to your computer and use it in GitHub Desktop.
C atoi and strrev (for fun)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* Test: | |
* gcc -o atoi atoi.c | |
* ./atoi 12345 123465 | |
* Output: | |
* Number: 12345 Reverse: 54321 54321 54321 | |
* Number: 123456 Reverse: 654321 654321 654321 | |
*/ | |
#include <stdio.h> | |
#include <stdlib.h> | |
#include <string.h> | |
int atoi(const char *a) { | |
int num = 0; | |
do { | |
num = (num * 10) + (*a - '0'); | |
} while (*++a); | |
return num; | |
} | |
char *strrev(char *s) { | |
char *b = s; | |
char *e = b + strlen(s) - 1; | |
while (e - b > 1) { | |
char temp = *b; | |
*b++ = *e; | |
*e-- = temp; | |
} | |
return s; | |
} | |
char *strrev2(char *s) { | |
int len = strlen(s); | |
char *e = s + len / 2; | |
char *b = e - !(len % 2); | |
while (*e) { | |
char temp = *b; | |
*b-- = *e; | |
*e++ = temp; | |
} | |
return s; | |
} | |
char *strrev3(char *s) { | |
int len = strlen(s); | |
for (int i=0; i < len/2; i++) { | |
char temp = s[i]; | |
s[i] = s[len - i - 1]; | |
s[len - i - 1] = temp; | |
} | |
return s; | |
} | |
typedef char *(*strrev_fn_t)(char *); | |
char *check_strrev(strrev_fn_t fn, const char *s) { | |
char temp[100]; | |
strcpy(temp, s); | |
return fn(temp); | |
} | |
int main(int argc, const char *argv[]) { | |
strrev_fn_t strrev_fns[] = {strrev, strrev2, strrev3, 0}; | |
int strrev_fns_len = sizeof(strrev_fns)/sizeof(strrev_fn_t); | |
if (argc < 2) { | |
fprintf(stderr, "Usage: %s integer\n", argv[0]); | |
return 0; | |
} | |
for (int i=1; i < argc; i++) { | |
// with an index | |
printf("Number: %-15d", atoi(argv[i])); | |
printf("Reverse:"); | |
for (int j=0; j < strrev_fns_len - 1; j++) | |
printf(" %15s", check_strrev(strrev_fns[j], argv[i])); | |
printf("\n"); | |
// with pointers | |
printf("Number: %-15d", atoi(argv[i])); | |
printf("Reverse:"); | |
strrev_fn_t *strrev_fn = strrev_fns; | |
do { | |
printf(" %15s", check_strrev(*strrev_fn, argv[i])); | |
} while (*++strrev_fn); | |
printf("\n"); | |
} | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment