提高效率 - 从字符串C ++解析整数

时间:2016-10-20 17:19:26

标签: c++ string parsing c++11 int

我有一个字符串:

  

12:56:72

我需要分别获得3个数字( 12 56 72 )。

我在做:

int i=0,j=0,k=0,n, p[3]; // p[i] stores each ith value
char x[], b[];
x="12:34:56";
n=strlen(x);
while(i<strlen){
        b[k]=x[i];
        ++i;
        ++k;
        if(x[i==]':'){
            p[j]=int(b);
            ++j;
            ++i;
            k=0;
            char temp[] = b;
            b=new char[];
            delete temp;
            }
        }

这可以更有效地完成吗?

4 个答案:

答案 0 :(得分:1)

为了提高效率&#34;,您需要进行分析。

这是另一种解决方案:

const std::string test_data("01:23:45");
unsigned int hours;
unsigned int minutes;
unsigned int seconds;
char separator;
std::istringstream input(test_data);
// Here's the parsing part
input >> hours >> separator >> minutes >> separator >> seconds;

这是否更高效&#34;与否,必须衡量 它看起来更简单,更安全。

编辑1:方法2
处理器不喜欢循环或分支,所以我们可以尽量减少。 此优化假设完美输入为字符串。

static const char test_data[] = "01:23:45";
unsigned int hours;
unsigned int minutes;
unsigned int seconds;
char c;
unsigned int index = 0;
hours = test_data[index++] - '0';
if (test_data[index] != ':')
{
  hours = hours * 10 + test_data[index++] - '0';
}
++index; // Skip ':'
minutes = test_data[index++] - '0';
if (test_data[index] != ':')
{
  minutes = minutes * 10 + test_data[index++] - '0';
}
++index; // Skip ':'
seconds = test_data[index++] - '0';
if (test_data[index] != ':')
{
  seconds = seconds * 10 + test_data[index++] - '0';
}

对于最高优化,您必须做出一些假设。另一个假设是字符编码是UTF8或ASCII,例如&#39; 1&#39; - &#39; 0&#39; == 1.

答案 1 :(得分:1)

由于您正在从文件流中读取数据,因此您可以使用该流的operator >>。当它将数据输入int时,它将继续读取文件,直到它遇到对int无效的字符。这个测量它会读取整数部分并将冒号留在文件中。由于这种行为,我们可以使用

ifstream fin("filename.ext");
int a, b, c;
char colon;
while(fin >> a >> colon >> b >> colon >> c)
{
    // do stuff with a, b and c
}

只要文件的格式为12:56:72,就会逐行读取文件。

答案 2 :(得分:0)

它看起来像一个时钟,但你仍然可以用sscanf扫描字符串:

#include <iostream>

using namespace std;

int main()
{
   char myclock[] = "10:11:12";
   int hours, minutes, seconds;
   sscanf(myclock, "%d:%d:%d", &hours, &minutes, &seconds);
   cout << hours << endl;
   cout << minutes << endl;
   cout << seconds << endl;
   return 0;
}

答案 3 :(得分:0)

您可以考虑使用C ++函数。

#include <string>
#include  <iostream>
using namespace std;

int main() {
    size_t i=0,j=0,k=0, p[3]; // p[i] stores each ith value
    string x("12:34:56");
    for (j=0; j<3; j++) {
        p[j] = stoi(x.substr(k), &i);
        k += i+1;
    }

    for (j =0; j < 3; j++)
        cout << p[j] << endl;
}