如何从C ++中的字符串数组中提取整数

时间:2015-09-12 00:47:24

标签: c++ c++11

给出一个表格数组

char* timePeriod= {"6AM#8AM","11AM#1PM","7AM#3PM","7AM#10AM","10AM#12PM"};

如何在以下形式的整数数组中提取开始和结束时间:

start_time={6,11,7,7,10}
end_time={8,1,3,10,12}

4 个答案:

答案 0 :(得分:1)

你可以使用" sscanf"这样做。并且不要忘记将其标记为有用:)

#include <stdio.h>
int main() 
{
    int a,b,i;
    int start_time[5], end_time[5];

    char *t[5] = {"6AM#8AM","11AM#1PM","7AM#3PM","7AM#10AM","10AM#12PM"};
    char *(*ptr)[5] = &t;

    for(i=0;i<5;i++)
    {
        sscanf((*ptr)[i], "%d%*[AP]M#%d%*[AP]M", &a, &b);
        start_time[i]=a;
        end_time[i]=b;
    }
    printf("Starting time : ");
    for(i=0;i<5;i++)
    {
        printf("%d ",start_time[i]);
    }
    printf("\nEnding time : ");
    for(i=0;i<5;i++)
    {
        printf("%d ",end_time[i]);
    }  
    return 0;
}
OUTPUT:
Starting time : 6 11 7 7 10 
Ending time : 8 1 3 10 12 

答案 1 :(得分:0)

一种非常简单的方法是使用strtok将字符串拆分为#,然后在每个部分上使用atoi。一旦看到非数字值,它就会停止。

答案 2 :(得分:0)

sscanf能够做到这一点,虽然我不认为这是一个非常好的方式。请查看here了解详情

#include <stdio.h>
int main() {
  const char* t = "6PM#8AM";
  int a, b;
  sscanf(t, "%d%*[AP]M#%d%*[AP]M", &a, &b);
  printf("%d %d\n", a, b);
  return 0;
}

或者你可以在C ++ 11中regex

#include <iostream>
#include <regex>
#include <string>
using namespace std;
int main() {
  string t("6PM#8AM");
  smatch match;
  regex re("([[:digit:]])+[AP]M#([[:digit:]])+[AP]M");
  if (regex_match(t, match, re)) {
    cout << match[1].str() << " " << match[2].str() << '\n';
  }
  return 0;
}

答案 3 :(得分:0)

注意:以下解决方案对您的数据集做了一些非常具体的假设(如果不是这种情况,您可能更喜欢使用正则表达式)。

  1. 字符串将始终以整数开头
  2. 结束时间将始终位于字符串的第4或第5个索引中
  3. 零不是有效时间
  4. #include <iostream>
    #include <string>
    
    int main() {
    
        std::string timePeriod[5] = {"6AM#8AM","11AM#1PM","7AM#3PM","7AM#10AM","10AM#12PM"};
        int   startTimes[5] = {0,0,0,0,0};
        int     endTimes[5] = {0,0,0,0,0};
    
        for(int i=0;i<5;i++) {
    
            std::string s = timePeriod[i];
            startTimes[i] = atoi(s.c_str());             // Convert first number to integer
            endTimes[i]   = atoi(s.substr(4).c_str());   // Convert 2nd numbers to integer
            if(endTimes[i] == 0)                         // If zero
                endTimes[i] = atoi(s.substr(5).c_str()); // Get the 5th index instead
    
            std::cout << "Start: " << startTimes[i] << "\t End: " << endTimes[i] << std::endl;
        }
    }
    

    缺少前导零使得它有点棘手,但最终 - 它可以使用子串快速解决(假设您也不介意将char *更改为std :: string)。