Skip to content

Instantly share code, notes, and snippets.

@sr105
Last active October 11, 2018 23:45
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sr105/fa031a0985ff773514700aab33619c0a to your computer and use it in GitHub Desktop.
Save sr105/fa031a0985ff773514700aab33619c0a to your computer and use it in GitHub Desktop.
C atoi and strrev (for fun)
/* 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