如何将字符串中的多个数字转换为整数

Posted

技术标签:

【中文标题】如何将字符串中的多个数字转换为整数【英文标题】:How to convert multiple numbers in a string into ints 【发布时间】:2018-05-03 00:17:49 【问题描述】:

我对如何获取多个包含数字的字符串并将它们转换为 int 感到困惑。我有多行字符串,它们以数据形式存储到整数中,然后将它们插入到称为值的二维数组中。之前在 *** 上发布了一个类似的问题;但是它似乎对我不起作用。我打印出了data中的每一行是什么,data中的每个字符串如下。

 75
 95 64
 17 42 82
 18 35 87 10

但是,当我在 main 中使用两个 for 循环从 value 中输出数字时,它会输出为 this。

75 0 0 0 95 64 0 0

95 64 0 0 17 42 82 0

17 42 82 0 18 35 87 10

18 35 87 10 0 0 0 0

我在打印sizeof(values)和sizeof(values[0])的时候发现数组values中有8列8个元素;但是,该程序似乎作为最后一个打印语句终止,我打印 hello 的地方没有发生。我在下面提供了我正在使用的代码。我想知道为什么会这样 以及我该如何解决?谢谢。

//const char DELIMITER = ' ';

int **values, // This is your 2D array of values, read from the file.
    **sums;   // This is your 2D array of partial sums, used in DP.

int num_rows; // num_rows tells you how many rows the 2D array has.
          // The first row has 1 column, the second row has 2 columns, and
          // so on...

bool load_values_from_file(const string &filename) 
ifstream input_file(filename.c_str());
if (!input_file) 
    cerr << "Error: Cannot open file '" << filename << "'." << endl;
    return false;

input_file.exceptions(ifstream::badbit);
string line;
vector<string> data;
try 
    while (getline(input_file, line)) 
        data.push_back(line);
        num_rows ++;
    
    input_file.close();
 catch (const ifstream::failure &f) 
    cerr << "Error: An I/O error occurred reading '" << filename << "'.";
    return false;

for(int x = 0; x < data.size(); x++)
    cout << data[x] << endl;


//https://***.com/questions/1321137/convert-string-containing-several-numbers-into-integers
//Help on making multiple numbers in a string into seperate ints
values = new int*[num_rows];
vector<int> v;
for(int y = 0; y < data.size(); y++)
    istringstream stream(data[y]);
    values[y] = new int[y + 1];
    int z = 0;

    while(1) 
       int n;
       stream >> n;
       if(!stream)
          break;
       values[y][z] = n;
       z++;
    
    z = 0;

sums = values;

return true;


int main(int argc, char * const argv[]) 

if (argc != 2) 
    cerr << "Usage: " << argv[0] << " <filename>" << endl;
    return 1;

string filename(argv[1]);
if (!load_values_from_file(filename)) 
    return 1;


cout << sizeof(values) << endl;
cout << sizeof(values[0]) << endl;

for(int x = 0; x < sizeof(values); x++)
    for(int y = 0; y < sizeof(values[x]); y++)
        cout << values[x][y] << endl;
    
    cout << endl;

cout << "hello" << endl;


return 0;

【问题讨论】:

您的问题不符合minimal reproducible example 的所有要求,如***.com 的help center 中所述,因此无法提供权威答案。什么是“总和”?生成输出的代码在哪里?如果输出未正确生成,您希望任何人如何找出未显示的代码中的问题?您是如何得出这样的结论,即问题一定出在解析输入的代码中,而不是在生成输出的代码中?当您使用调试器单步调试程序时,您做了哪些观察? 抱歉,我不想添加太多行,我认为这些只是多余的代码行,不需要显示。我将对其进行编辑以包含它 确实,***.com 不是一个可以倾倒整个程序并等待有人找出问题所在的网站。这就是为什么要求是“minimal reproducible example”,而不是“整个程序”。此外,正如我所问的“当您使用调试器单步执行程序时,您做了什么观察”。具体来说:在问题中显示的函数末尾设置断点并使用调试器检查 values 数组中的值后,调试器告诉您其中有什么? 正如我所料,您尝试打印值的代码已损坏。 sizeof() 没有做你认为的事情。指向一个指针的int **sizeof() 与指向十亿个指针的int **sizeof() 的值相同。 我第一次看到 values 有 8 列,每个数组有 8 个元素。但是,在第 4 个数组之后,程序终止,因为当我在打印所有数字之前尝试打印 array[4][0] 时,它也崩溃了。我将编辑我的问题以包含此详细信息。 【参考方案1】:

看到这个:

#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <algorithm>

using namespace std;
int main()

    string str;
    ifstream fs("D:\\Myfolder\\try.txt", ios::in);
    stringstream ss;
    std::string item;
    if (fs.is_open())
           
        ss << fs.rdbuf();
        str = ss.str();
        cout << str << endl;
        fs.close();
    

    cout << "\n\n Output \n\n";
    while (std::getline(ss, item, ' '))
    
        cout << std::atoi(item.c_str()) <<" ";
    

    return 0;

【讨论】:

您的输出缺少第一列中的几个条目 @bcr:数字 75(之前已删除)、 95,17 和 18 之前有空格,使用来自 OP 的复制粘贴,与分隔符冲突,因此它们丢失了。我删除了输出以避免混淆。

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

如何将日期(“Ymd”)的输出转换为 PHP 中的数字? [复制]

如何将切片字符串中的单个字符转换为 Python 中的整数?

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

怎样用c语言编写将字符串转换为整数的函数

将字符数字转换为C中的相应整数

python如何将字符转换为数字