Posted By

architect on 07/07/09


Tagged

String parsing


Versions (?)

Parse string


 / Published in: C
 

parseint, parsefloat - functions for getting values of parameters from string like as str = "HDD=160; CPU=2.2;RAM=1024". Using: int i; float f; parseint(str, "HDD", &i); parsefloat(str, "CPU", &f);

  1. #include <iostream>
  2. #include <cstring>
  3. // (auxiliary function)
  4. //str - input string, substr - substring, out - array where we get result
  5. //Example. Input parameters: str == "HDD=160; CPU=2.2;RAM=1024;min=-5.2;max=5.7;speed=3.1;a=-4", substr == "CPU"
  6. // Output: out == "1024"
  7. //str - входная строка (например, "HDD=160; CPU=2.2;RAM=1024"). Разделитель целой и дробной частей - точка
  8. //substr - название параметра, значение которого ищется (например, "CPU")
  9. //out - указатель на предварительно выделенный массив. В него запишется значение параметра (для "CPU" это "2.2")
  10. //max - если не равен нулю то используется для избежания переполнения массива out. Если равен 0, то переполнение не контролируется.
  11. //max - это размер массива out
  12. bool find_param_value(const char* str, const char* substr, char* out, size_t max = 0)
  13. {
  14. char *p = strstr(str, substr);
  15. if (!p)
  16. return false;
  17. char digits[] = "-0123456789";
  18. p = strpbrk(p, digits);
  19. if (!p)
  20. return false;
  21. char spaces[] = " ;";
  22. char *p2 = strpbrk(p, spaces);
  23. if (!p2)
  24. p2 = const_cast<char*>(str) + strlen(str);
  25. size_t size = p2 - p;
  26. if (max == 0 || size < max)
  27. {
  28. strncpy(out, p, size);
  29. out[size] = 0;
  30. return true;
  31. }
  32. else
  33. return false;
  34. }
  35.  
  36. bool parse_int(const char* str, const char* substr, int* param)
  37. {
  38. size_t max = 64;
  39. char strvalue[max];
  40. if (find_param_value(str, substr, strvalue, max))
  41. {
  42. *param = atoi(strvalue);
  43. return true;
  44. }
  45. else
  46. return false;
  47.  
  48. }
  49. bool parse_float(const char* str, const char* substr, float* param)
  50. {
  51. size_t max = 64;
  52. char strvalue[max];
  53. if (find_param_value(str, substr, strvalue, max))
  54. {
  55. *param = atof(strvalue);
  56. return true;
  57. }
  58. else
  59. return false;
  60. }
  61.  
  62. int main()
  63. {
  64. int vali;
  65. float valf;
  66. char *str = "s=12;RAM = 1024;HDD = 320;CPU = 2.14;size=1;pi=3.14;iterations=5000";
  67. bool bi = parse_int(str, "iterations", &vali);
  68. bool bf = parse_float(str, "pi", &valf);
  69. std::cout << bi << " " << vali << " | " << bf << " " << valf << std::endl;
  70. return 0;
  71. }

Report this snippet  

You need to login to post a comment.