如何将C++或C中的字符串转换为整数数组?

zd287kbt  于 2023-10-20  发布在  其他
关注(0)|答案(6)|浏览(130)

如何将字符串转换为整数数组?我可以使用sstream,因为atoi不工作?!

5lwkijsr

5lwkijsr1#

正如你在注解中所说,你得到了一个二进制字符串,你想把它转换成整数。使用bitset:

std::istringstream is(str);
std::bitset<32> bits; // assuming each num is 32 bits long

while(is >> bits) {
    unsigned long number = bits.to_ulong();
    // now, do whatever you want with that long.
    v.push_back(number);
}

如果字符串str中只有一个二进制数,

unsigned long number = std::bitset<32>(str).to_ulong();

在C中转换也是可能的...

long value;
char const *c = str;
for(;;) {
    char * endp;
    value = strtol(c, &endp, 2);
    if(endp == c)
        break;

    /* huh, no vector in C. You gotta print it out maybe */
    printf("%d\n", value);
    c = endp;
}

atoi无法解析二进制数。但是strtol可以解析它们,如果你告诉它正确的碱基。

wvmv3b1j

wvmv3b1j2#

您希望转换工作的具体方式是什么?你只是想要一个包含数组中每个字符的ASCII值的数组吗?(所以“abc”变成[97,98,99,0])?
或者你想以某种方式解析字符串吗?(“1,2,3”变成数组[1,2,3])
在第一种情况下,在C++中,我会这样做:

struct convert {
  int operator()(char c) {
    return static_cast<int>(c);
  }
};

std::string str = "hello world";
std::vector<int> result;
std::transform(str.begin(), str.end(), std::back_inserter(result), convert())

当然你可以用一个原始数组来代替向量,但是由于字符串的长度可能是可变的,那么数组就是在自找麻烦。
如果这不是你想要的,你可能想编辑你的问题,使其更具体。

jtoj6r0c

jtoj6r0c3#

据我所知,对于输入字符串“1,1,0,0,1,3”将转换为数组{1,1,0,0,1,3}。下面是如何在C++中实现的:

string a = "1110011000";
vector<int> v;
for(int i = 0 ; i < a.length() ; i++){
    v.push_back(a[i] -'0');
}

// Check the result
for(int i = 0 ; i < v.size() ; i++){
    cout << v[i] << endl;
}
rdrgkggo

rdrgkggo4#

快速字符串拆分器例程:

convert(string str, string delim, vector<int>& results)
{
  int next;
  char buf[20];
  while( (next= str.find_first_of(delim)) != str.npos ) {
    if (next> 0) 
      results.push_back(atoi(str.substr(0,next), buf, 10));
    str = str.substr(next+1);
  }
  if(str.length() > 0)
    results.push_back(atoi(str.substr(0,next), buf, 10));
}

您可以使用stringstream而不是atoi(它确实有效,一次处理一个int)

int i;
stringstream s (input_string)
s >> i;

如果你把合并我和贾尔夫的代码结合起来,你会得到一些非常好的东西。

aydmsdu9

aydmsdu95#

简体中文
表头:

#include <stdlib.h>

功能原型:

long int strtol(const char *nptr, char **endptr, int base);

示例用法:

strtol(nptr, (char **) NULL, 10);
i7uaboj4

i7uaboj46#

将istream_iterator与字符串流结合使用。
数组我假设你真的是指一个std::vector,因为你在编译时不知道整数的数量。但是代码可以很容易地修改为使用数组而不是向量。

#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <iterator>
#include <algorithm>

int main()
{
    std::string         data = "5 6 7 8 9";
    std::stringstream   dataStream(data);
    std::vector<int>    store(
                            std::istream_iterator<int>(dataStream),
                            std::istream_iterator<int>{}
                        );

    // This line just copies the store to the std::cout
    // To verify it worked.
    std::copy(store.begin(),
              store.end(),
              std::ostream_iterator<int>(std::cout,",")
             );
}

相关问题