Advertisement
losinggeneration

Untitled

Jun 26th, 2013
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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("(%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("(%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("(%c) %x ", str[i], &str[i]);
  48.         if(str[i] == ',') num++;
  49.     }
  50.     printf("\n");
  51.  
  52.     return num;
  53. }
  54.  
  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.         num++;
  68.     }
  69.     printf("\n");
  70.  
  71.     return num;
  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. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement