我有一个字符串:
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;
}
}
这可以更有效地完成吗?
答案 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;
}