如何在c++中从字符串数组中提取整数

How to extract integers from array of strings in C++

本文关键字:数组 提取 整数 字符串 c++      更新时间:2023-10-16

给定一个形式为

的数组
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}

您可以使用"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 

一个非常简单的方法是使用strtok在#上分割字符串,然后在每个片段上使用atoi。当它看到非数值时,它将停止。

sscanf是能够做到这一点,虽然我不认为这是一个很好的方式。详情请看这里

#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 %dn", 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;
}

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

  1. 字符串总是以整数开头
  2. 结束时间将始终在字符串的第4或第5索引
  3. 0不是有效时间

#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)。