如何将一个字符串转换为三个整数

Posted

技术标签:

【中文标题】如何将一个字符串转换为三个整数【英文标题】:How to convert a string into three integers 【发布时间】:2021-05-05 21:46:10 【问题描述】:

我目前正在尝试将字符串转换为三个整数。我需要用“11”、“5”和“2”做一些数学运算。至少在这个例子中。我尝试使用 stoi() 将字符串转换为整数,但我无法执行仅获取部分字符串的部分,如下面的第二个示例所示。有一个简单的解决方案吗?我这周开始用 C++ 编程,所以我没有太多的知识。

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

int main() 
  int seconds 01 = 0;
  int seconds 10 = 0;           // somehow either one was beeing set to 35 by default, so I had to do 
                               this
  int minutes = 0;          
  string time = "11:52"; // mm:ss format
  
  // I need to convert the string into three integers
  
  cout << minutes << "  " << seconds10 "  " << seconds01;
  return 0;

第二个例子:

string time = "01:50"; // mm:ss format
  int seconds10 = stoi(time[3]);
// [Error] call of overloaded 'stoi(char&)' is ambiguous

功能:

分钟应该输出“11” 秒10 = 5 秒01 = 2

【问题讨论】:

@RemyLebeau 你能举个例子吗,我不明白你想建议什么 如果在 VS 或 gcc/clang 和 -Wall -Wextra -pedantic -Wshadow 上添加 /W3 警告并修复所有警告。 由于您正在处理最后两个数字的数字,int seconds10 = time[3] -'0'; 可能就足够了。 Explanation 【参考方案1】:

stoi(time[3]) 不起作用,因为它会将单个 char 传递给 stoi(),它需要一个以 null 结尾的 char* 字符串。您可以改用stoi(&amp;time[3])(因为string 的内部缓冲区在C++11 及更高版本中保证为空终止),或者更好的是stoi(time.c_str()+3),例如:

string time = "01:50"; // mm:ss format

int seconds = stoi(time.c_str()+3);
int seconds10 = seconds / 10;
int seconds01 = seconds % 10;

否则,您可以通过string::find()string::substr()std::string拆分为所需的子字符串,然后将子字符串转换为整数,例如:

string time = "11:52"; // mm:ss format

auto pos = time.find(':');
int minutes = stoi(time.substr(0, pos));
int seconds = stoi(time.substr(pos+1));
int seconds10 = seconds / 10;
int seconds01 = seconds % 10;

或者,您可以将std::string 放入std::istringstream,然后使用operator&gt;&gt; 从中提取值,例如:

string time = "11:52"; // mm:ss format
int minutes, seconds;
char colon;

istringstream iss(time);
iss >> minutes >> colon >> seconds;
int seconds10 = seconds / 10;
int seconds01 = seconds % 10;

话虽如此,您也可以像这样提取seconds10seconds01 值(参见How to convert a single char into an int),例如:

string time = "11:52"; // mm:ss format
int minutes, seconds10, seconds01;

int minutes = ...;
int seconds10 = time[3] - '0';
int seconds01 = time[4] - '0';

【讨论】:

感谢最后两个解决方案很棒。我不是 100% 理解他们,但现在我很好。谢谢【参考方案2】:

问题的第一部分:分割字符串

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

int main() 
  string time = "11:52"; // mm:ss format
  
  int pos = time.find(':');
  int minutes = stoi(time.substr(0, pos));
  int seconds = stoi(time.substr(pos, 5));
  
  cout << minutes <<":" << seconds<< endl;
  return 0;


你得到分钟和秒的整数。

第 2 部分:获得几十秒

一种简单的方法是拆分整数:

// seconds is 52

int seconds01 = seconds % 10; // gives 2
int seconds10 = (int)seconds / 10; // gives 5

然后您可以将数学应用于秒数。

【讨论】:

time.substr(pos, 5) 是错误的。 pos 保存: 的索引,第二个参数是计数而不是索引。它需要改为time.substr(pos+1, 2),或者只是time.substr(pos+1)【参考方案3】:

您还可以创建一个这样的函数来拆分字符串并将其转换为向量。

#include <iostream>
#include <vector>
#include <sstream>
#include <algorithm>

std::vector<int> to_ints(std::string const& s, char delim)

    std::vector<int> result;
    std::istringstream iss(s);
    std::string token;
    while(std::getline(iss, token, delim))
        result.push_back(std::stoi(token));
    return result;


int main()

    std::string str "01:50:34:2341" ;
    auto ints = to_ints(str, ':');

    for (auto number : ints)
    
        std::cout << number << "\n";
    

    return 0;

输出

1
50
34
2341

【讨论】:

以上是关于如何将一个字符串转换为三个整数的主要内容,如果未能解决你的问题,请参考以下文章

用JAVA编程将任意一个整数转换成中文大写,如101转换为一百零一

编写一个函数,将一个数字字符串转换为一个整数

如何将字符串转换为整数?

java 中如何将一个字符串转换成一个整数数组

用C++如何将一个整数转换成一个IP地址?

C++——如何将一个字符串转换为多个整数?