如何在 C++ 中将每个特定字符更改为 int

How to change each specific char to an int in C++

提问人:hyeonwoo park 提问时间:1/13/2023 最后编辑:Remy Lebeauhyeonwoo park 更新时间:1/13/2023 访问量:87

问:

这可能是一个非常愚蠢的问题,但我试图查找它,并在谷歌上搜索了一堆,但仍然无法找到一个简单的方法......

在 C++ 中,说:using namespace std;

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    String N;

    cin >> N;
}

当用户输入为 时,将是 。123N"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.
}
C++ 字符串 转换 整数

评论

1赞 Ted Lyngmo 1/13/2023
String N;-什么?真的有必要展示你想展示的东西吗?Stringios_base::sync_with_stdio(0); cin.tie(0);
1赞 500 - Internal Server Error 1/13/2023
行不通?return (N[curr_ind] - '0');
2赞 Ted Lyngmo 1/13/2023
“我不能使用 %” - 为什么?
2赞 Jeffrey 1/13/2023
“我不能使用 %”可能意味着“我的教授希望我在 和 not 和 on 上使用循环charstring%10/10int"

答:

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::vectorint

评论

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'intsizeof(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::vectornew[]
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'