将字符串转换为int数组

时间:2015-06-21 15:39:44

标签: c++ arrays

我有以下问题。我想将像"10 15 30"这样的字符串转换为带有整数10, 15, 30的int数组。我在谷歌搜索了很多,但通常解决方案包括矢量(我不熟悉)或其他更复杂的解决方案。我找到了这样的代码:

#include <cstdio>
void foo ( char *line ) {
    int num, i = 0, len;
    while ( sscanf( line, "%d%n", &num, &len) == 1 ) {
        printf( "Number %d is %d; ", i, num );
        line += len;    
        i++;            
    }
}
int main ( ) {
    char test[] = "12 45 6 23 100";
    foo( test );
    return 0;
}

它以我想要的方式工作并从字符串中提取数字,但我不理解:

line += len;

有人可以解释一下它的工作原理吗?我们为什么要将lenint)添加到字符串?

6 个答案:

答案 0 :(得分:2)

C ++解决方案:

#include <iostream>
#include <sstream>
#include <vector>

std::vector< int > foo ( char *c_str ) {
    std::istringstream line( c_str );
    std::vector< int > numbers;
    for ( int n; line >> n; )
        numbers.push_back( n );
    return numbers;
}

int main ( ) {
    char test[] = "12 45 6 23 100";
    std::vector< int > numbers = foo( test );
    for ( int n : numbers )
        std::cout << n << ' ';
    return 0;
}

输出:

12 45 6 23 100

答案 1 :(得分:0)

%n指定sscanf在一次执行中访问的字符数,并将其保存在变量len中。 所以line + =len;正在递增变量linesscanf

访问的字符数量

line + =len;只是line =line+ len;

答案 2 :(得分:0)

sscanf(line,“%d%n”,&amp; num,&amp; len)

此行从行读取一个数字,并将数字放入num和读入len的字符数。

我们需要len来将指针移动到字符串的未读部分。

有意义吗?

有用的链接: scanf sscanf

答案 3 :(得分:0)

line += len;相当于line = line + len;

line是一个char指针,因此代码将指针增加len,以便每次执行循环时指针指向下一个数字。通过调用len更新了sscanf()以上的注释。

答案 4 :(得分:0)

“string”是指向字符缓冲区的指针。您正在执行指针运算以增加sscanf以解析缓冲区中的下一个int字符。所以,在你的例子中:

char test [] =“12 45 6 23 100”;

说*行指向要测试,并且有一些指针值,我们不关心这个值是什么,所以假设它是1000.在第一次调用sscanf之后,你读到了“12”。这是两个字符,因此len应返回2.行然后设置为1002,现在“指向”缓冲区中的下一组字符。 sscanf读取它,并继续,直到缓冲区中没有更多字符。

答案 5 :(得分:0)

看看sscanf docs。它接收格式和其他参数。

在params中,您使用"%d%n"解释了{{1}}。

  

d

     

十进制整数

     

任意数量的十进制数字(0-9),可选地前面带有符号(+或 - )。 d表示签名参数,u表示无符号。

     

<强>名词

     

计数

     

不消耗任何输入。   到目前为止从stdin读取的字符数存储在指向的位置。

所以你从字符串读取整数和这个整数组成的字符数。

读完部分字符串后,将指针移动到读取字符数。