Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 仅将std::字符串中的数字转换为int_C++_String_Int_Std - Fatal编程技术网

C++ 仅将std::字符串中的数字转换为int

C++ 仅将std::字符串中的数字转换为int,c++,string,int,std,C++,String,Int,Std,我试图只将字符串中的数字转换为int向量,但这会给出数字0到9的ASCII码 有没有办法只把数字转换成整数?我想我必须使用char数组,因为atoi()不能处理std::string,而且c_str()方法不能处理每个字符,只能处理整个字符串 #include <cctype> #include <iostream> #include <vector> using namespace std; int main() { string chars_a

我试图只将字符串中的数字转换为int向量,但这会给出数字0到9的ASCII码

有没有办法只把数字转换成整数?我想我必须使用char数组,因为atoi()不能处理std::string,而且c_str()方法不能处理每个字符,只能处理整个字符串

#include <cctype>
#include <iostream>
#include <vector>

using namespace std;

int main() {
    string chars_and_numbers = "123a456b789c0";
    vector<int> only_numbers;

    for (int i = 0; i < chars_and_numbers.length(); i++) {
        if (isdigit(chars_and_numbers[i])) {
            cout << chars_and_numbers[i] << " ";
            only_numbers.push_back(int(chars_and_numbers[i]));
        }
    }

    cout << endl;

    for (vector<int>::iterator i = only_numbers.begin(); i != only_numbers.end(); i++) {
        cout << *i << " ";
    }

    return 0;
}

如果打印整数向量时所需的输出是实际数字0到9,则可以依赖“0”到“9”的ASCII值是连续的这一事实:

only_numbers.push_back(char_and_numbers[i] - '0');
因此,“8”变为“8”-“0”,或56-48,即8

ASCII Character    ASCII Code(decimal)  Literal Integer
      '0'               48                      0
      ...               ...                    ...
      '9'               57                      9
int(字符和数字[i])
返回ASCII字符的基本ASCII代码,而不是所需的文本整数

通常,如果
i
属于[0,9],则
'i'-'0'
会导致
i

例如,
'1'-'0'
返回两个ASCII字符(49-48)的值之间的距离,即1

intmain(){
字符串字符和数字=“123a456b789c0”;
仅矢量_数;
对于(int i=0;icout将
istringstream
做您需要的事情吗?更好的是,请给出一个输入和预期输出的示例。
int(chars_和_numers[i])
没有做您认为应该做的事情。
char
类型是一个整数类型,如
int
short
。它包含(通常)字符的ASCII整数值,这就是为什么
'0'
在数组中显示为
48
。若要将数字转换为其等效整数,请使用
字符和数字[i]-'0'
,它从数字的ASCII值中减去
'0'
的整数值,得到
'0'
0
,以及
'1'
1
,等等。当然,对于这种特殊情况,您可能会想使用
stringstream
,因此这不是很有帮助,但至少应该教会您我再次希望不存在的
transform\u if
算法。不管怎样,您是否希望
仅\u数字
看起来像
{1,2,3,4,5,6,7,8,9,0}
{123,456,789,0}
完成后?就像第一个一样。stringstream会给我字符之间的数字,而不是单个数字?你不需要依赖ASCII,你可以依赖这样一个事实,即标准要求数字字符在字符集中连续存储。(它对字母字符不起同样的作用,事实上EBCDIC也不起同样的作用,但对数字你是安全的。)@George Gaál-你将不会使用Unicode的
std::string
(我希望)。有很多误解。据我所知,有不同类型的Unicode。其中一种是UTF-8,它完全适合std::string。但我不能说这是最好的方法来包含它。乔治:不幸的是,围绕这些误解也有很多误解。只有一种Unicode。(但是有很多方法可以表示Unicode码点序列。)@Kerrek SB,你是对的。但是码点指的是一些数字,我们可以进行分析。还有减法:)我认为OP实际上想要做的是只使用数字
。但我可能错了。这很含糊。是的,不是很清楚。我假设他提到的“数字”是单个数字。是的,Eric和George Gaál,我只想要单个数字。这正是我想要的。谢谢。@Tiago,如果Eric的答案解决了你的问题,你应该投接受票。
ASCII Character    ASCII Code(decimal)  Literal Integer
      '0'               48                      0
      ...               ...                    ...
      '9'               57                      9
int main() {
    string chars_and_numbers = "123a456b789c0";
    vector<int> only_numbers;

    for (int i = 0; i < chars_and_numbers.length(); i++) {
        if (isdigit(chars_and_numbers[i])) {
            cout << chars_and_numbers[i] << " ";
            // here is what you want
            only_numbers.push_back(chars_and_numbers[i] - '0');
        }
    }

    cout << endl;

    for (vector<int>::iterator i = only_numbers.begin(); i != only_numbers.end(); i++) {
        cout << *i << " ";
    }

    return 0;
}