提问人:hyeonwoo park 提问时间:1/13/2023 最后编辑:Remy Lebeauhyeonwoo park 更新时间:1/13/2023 访问量:87
如何在 C++ 中将每个特定字符更改为 int
How to change each specific char to an int in C++
问:
这可能是一个非常愚蠢的问题,但我试图查找它,并在谷歌上搜索了一堆,但仍然无法找到一个简单的方法......
在 C++ 中,说:using namespace std;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
String N;
cin >> N;
}
当用户输入为 时,将是 。123
N
"123"
我如何转换为 int 、 int 和 int ?'1'
1
'2'
2
'3'
3
我不能使用 .%
如果我在字符串中使用索引方法,那就太棒了。
我想要一个接收及其索引作为参数的函数。例如:N
int func(string N, int curr_ind)
{
// change curr_ind of N to a single int
// for instance, "123" and 1, it would return 2.
}
答:
2赞
sweenish
1/13/2023
#1
#include <iostream>
#include <string>
int get_digit_from_string(const std::string&s, int idx) {
return static_cast<int>(s[idx] - '0');
}
int main() {
std::string num{"12345"};
for (std::size_t i = 0; i < num.length(); ++i) {
std::cout << get_digit_from_string(num, i) << '\n';
}
}
只需在索引处获取字符,减去 ,然后转换为 。'0'
int
减法是必要的,否则数字的字符将被转换为该字符的 ASCII 值。的 ASCII 值为 。'0'
48
输出:
❯ ./a.out
1
2
3
4
5
现在,只是为了好玩,假设您需要经常访问这些数字。理想情况下,您只需一次进行所有转换,并为您提供这些转换。这是执行此操作的一种方法(需要 C++20):int
#include <algorithm>
#include <iostream>
#include <iterator>
#include <string>
#include <vector>
std::vector<int> get_digits_from_string(const std::string& s) {
std::vector<int> v;
std::ranges::transform(s, std::back_inserter(v),
[](auto c) { return static_cast<int>(c - '0'); });
return v;
}
int main() {
std::string num{"12345"};
std::vector<int> digits = get_digits_from_string(num);
for (auto i : digits) {
std::cout << i << '\n';
}
}
我们使用字符串创建一个,其中每个元素都是单个字符。然后,我可以访问向量并轻松获取我需要的任何数字。std::vector
int
评论
0赞
user4581301
1/13/2023
必须提醒将来的人,不能保证 ASCII 编码。这与答案的实质无关,因为连续和升序数字是有保证的。
2赞
Remy Lebeau
1/13/2023
此外,其余部分,始终验证用户输入!在尝试转换它们之前,请确保输入确实包含数字。
0赞
Pete Becker
1/13/2023
在,演员的原因是什么?的类型是 already(除非 和 是 unsigned)。return static_cast<int>(s[idx] - '0')
s[idx] - '0'
int
sizeof(char) == sizeof(int)
char
0赞
Pete Becker
1/13/2023
回复:“数字的字符将被铸造”不,除非你写一个铸造。强制转换是您在源代码中编写的内容,用于告诉编译器进行转换。中的值将是数字的编码值;实际值取决于字符编码(现在通常是 ASCII)和所表示的字符。s[idx]
0赞
Eljay
1/13/2023
@user4581301 • 语言确实要求字符按顺序递增。如果底层编码不同(例如,DS9K 的字符编码),编译器必须进行补偿。'0'
'9'
0赞
Gunther
1/13/2023
#2
另一种可能性:
#include <iostream>
#include <string>
int main()
{
std::string input;
std::cin >> input;
// allocate int array for every character in input
int* value = new int[input.size()];
for (int i = 0; i < input.size(); ++i)
{
std::string t(1, input[i]);
value[i] = atoi(t.c_str());
}
// print int array
for (int i = 0; i < input.size(); ++i)
{
std::cout << value[i] << std::endl;
}
delete[] value;
}
输出:
x64/Debug/H1.exe
123
1
2
3
评论
0赞
Remy Lebeau
1/13/2023
最好使用而不是std::vector
new[]
0赞
Gunther
1/13/2023
std::vector,当然。已经很晚了 - 大脑只有 80% :-)
0赞
Roberto Carlos Cruz Rodríguez
1/13/2023
#3
试试这个:
int func(string N, int curr_ind)
{
return static_cast<int>(N[curr_ind]-'0');
}
由于连续数字的 ASCII 表示形式相差 1,因此将表示数字的字符 () 转换为相应的整数所需要做的就是:char c;
c-'0'
评论
String N;
-什么?真的有必要展示你想展示的东西吗?String
ios_base::sync_with_stdio(0); cin.tie(0);
return (N[curr_ind] - '0');
char
string
%10
/10
int
"