用C ++分隔间隔数

时间:2013-02-02 20:03:54

标签: c++ sorting input output

您好我正在开发一个小程序来整理从文件中获取的数字。目前,我目前的难题是如何将文件中的数字作为一次一个整数或如何将它们与字符串分开。

sample input: 

3 4 6 60 9 10 2 20  
56 11 18
34

output:
3 4 6 60 9 10 2 20 56 11 /*prints out the first 10 numbers taken in then sorts it*/
3 4 6 9 10 11 18 20 56 60 /* after first 10 it looks at the next input then sorts it again*/
4 6 9 10 11 18 20 34 56 60
void Sortingnums(char *nums,int firsttime)
{
    //holds counter and temporary number//
    int i, k, temp;
    //holds temporary c string//
    char* wordnum;
    //just take in the first ten numbers and that is it.
    if(firsttime == 0)
    {
        wordnum = strtok(nums," "); 
        numbers[0] = atoi(wordnum);
        //take in the first 10 numbers in the string//
        for(i = 1; i < 10; i++)
        {
            wordnum = strtok(NULL," "); 
            numbers[i] = atoi(wordnum); //store the number//
        }
        // output the first 10 numbers//
        for(i = 0; i < 10; i++)
        {
            cout << numbers[i] << " " << endl;
        }
        firsttime++;
    }
    while(
样本下的

是我的排序算法,它接受一个cstring数组并将其拆分成由空格分隔的整数,但是我遇到的问题是前10个数字必须先打印。

我如何理清剩下的输入? (第一行输入可以有10个以上的数字)

2 个答案:

答案 0 :(得分:0)

我正在尝试基本和简单但实际上使用C ++(和基本的C函数)。

  1. 将文件中的所有文本读入std :: string。
  2. 将分隔符'\ n'(或“\ r \ n”,取决于输入)拆分为“std :: vector lines”。 (使用std :: string :: find(),std :: string :: substr())。
  3. 循环行,并且每个行由分隔符''分割成“std :: vector string_numbers”。
  4. 循环“string_numbers”并使用atoi()将每个string_number插入到std :: vector number中。
  5. 排序(网络上的许多算法。冒泡排序非常简单,但效率不高O(n ^ 2)。如果您希望自己实现更高效的东西,请查看合并排序O(nlogn)或快速排序O(nlogn)在平均情况下,更难实现,但速度更快)。

答案 1 :(得分:0)

我建议使用标准模板库来帮助您控制数字和排序。此外,我不确定数字2和3在你的示例输出行中的位置...我假设这是一个错字,你不需要从排序的向量中删除这些数字由于某种原因。

无论如何,我会做这样的事情:

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

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

using namespace std;

bool mySort(int i, int j) 
{ 
    return (i < j); 
}

void printVector(vector<int> &v)
{
    for (int i = 0; i < v.size(); i++)
        cout << v[i] << " ";

    cout << endl;
}

void getNumbers(string &strNums)
{
    ifstream file("input.txt");
    string line;

    if (file.is_open())
    {
        while (file.good())
        {
            getline(file, line);
            strNums += line + " ";
        }

        file.close();
    }
}

void sortAndPrintNumbers(char *input)
{
    vector<int> vNums, vNumsSorted;
    char * strNum = strtok(input, " ");

    if (strNum)
        vNums.push_back(atoi(strNum));

    while (strNum)
    {
        strNum = strtok(NULL, " ");

        if (strNum)
            vNums.push_back(atoi(strNum));
    }

    // Get first 10 numbers, print them, then sort.
    for (int i = 0; i < 10 && i < vNums.size(); i++)
        vNumsSorted.push_back(vNums[i]);

    printVector(vNumsSorted);
    sort(vNumsSorted.begin(), vNumsSorted.end(), mySort);

    for (int i = 10; i < vNums.size(); i++)
    {
        vNumsSorted.push_back(vNums[i]);
        sort(vNumsSorted.begin(), vNumsSorted.end(), mySort);
        printVector(vNumsSorted);   
    }

    cout << endl;
}

int main()
{
    string strNums;

    getNumbers(strNums);

    char * pNums = new char[strNums.size() + 1];
    strcpy(pNums, strNums.c_str());

    sortAndPrintNumbers(pNums);
    delete [] pNums;
}

在字符数组和字符串之间交换有点混乱,但我不确定你是否想要使用Boost或只是想看到strtok解决方案。此外,您可以指定仅要排序的矢量项的范围,因此更优雅的解决方案可以利用它。

干杯