从char数组处理数据

时间:2017-05-08 22:35:56

标签: c arrays

我有一点问题,

我有一个像这样的字符数组:

char buff[256] = { "2 22 3 14 5 8 23 45 2 7 88"};

我需要做的是:

  • 如果buff中的第一个数字大于5,我需要对这个数字进行排序ASC
  • 如果buff中的第一个数字小于5,我需要对这个数字进行排序DESC

在这个例子中,第一个数字是2,所以我需要对这个数组DESC进行排序

我想创建一个int数组并将数字从char buff复制到int数组但我无法弄清楚如何执行此操作。

在int数组中对这些数据进行排序很容易。

我试过这样的事情:

    int array[256];
    for (int i = 0; i<26; i++)
        array[i] = atoi(&buff2[i]);

,结果不太好

array[0]: 2
array[1]: 22
array[2]: 22
array[3]: 2
array[4]: 3
array[5]: 3
array[6]: 14
array[7]: 14
array[8]: 4
array[9]: 5
array[10]: 5
array[11]: 8
array[12]: 8
array[13]: 23
array[14]: 23
array[15]: 3
array[16]: 45
array[17]: 45
array[18]: 5
array[19]: 2
array[20]: 2
array[21]: 7
array[22]: 7
array[23]: 88
array[24]: 88
array[25]: 8

2 个答案:

答案 0 :(得分:1)

对于'C'答案,我会使用wsCSV,因为它会告诉您解析后的数字在缓冲区中的结束位置:

strtol

打印:

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

int main() {
    char buff[] = "2 22 3 14 5 8 23 45 2 7 88";
    char* p=buff;
    for(;;) {
        char* ep;  // end pointer
        int n = strtol(p, &ep, 0);
        // if ep == p, no parsing took place
        if(p != ep) {
            // parsing succeeded
            printf("%d\n", n);
        }
        if(!*ep) break;  // check if we hit the end of the string
        p = ep + 1;      // advance to the next character
    }
}

答案 1 :(得分:1)

对于C ++,您可能希望将文本转换为std::istringstream,然后将其视为输入流:

const char buff[] = { "2 22 3 14 5 8 23 45 2 7 88"};
const std::string text(buff);
std::vector<int> database;
std::istringstream  buf_stream(text);
int value;
while (buf_stream >> value)
{
    database.push_back(value);
}

对于升序和降序排序,您可以编写比较函数并将其传递给std::sort