正在将字符串转换为int数组

Converting string into int array

本文关键字:int 数组 转换 字符串      更新时间:2023-10-16

我有以下问题。我想将像"10 15 30"这样的字符串转换为具有int 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;

有人能解释一下它是如何工作的吗?为什么要将len(即int)添加到字符串中?

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

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

line + =len;不过是line =line+ len;

line += len;等效于line = line + len;

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

"字符串"是指向字符缓冲区的指针。您正在执行指针运算以增加sscanf,从而解析缓冲区中的下一个int字符。因此,在您的示例中:

char test[]="12 45 6 23 100";

比如*line指向测试,并且有一些指针值,我们不在乎这个值本身是什么,所以假设它是1000。在第一次调用sscanf之后,您在中读取"12"。这是两个字符,所以len应该返回2。行然后被设置为1002,并且现在"指向"缓冲区中的下一组字符。sscanf读取该内容,并继续执行此操作,直到缓冲区中不再有字符为止。

查看sscanf文档。它接收格式和附加参数。

在params中,您有"%d%n",您可以使用文档中的格式表进行解释。

du

十进制整数

任意数量的十进制数字(0-9),可选择前面加一个符号(+或-)。d表示有符号的参数,u表示无符号的参数。

n

计数

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

所以您可以从字符串中读取integer,以及这个整数所包含的字符数。

读取字符串的一部分后,将指针移动到已读取的字符数中。

sscanf(行,"%d%n",&num,&len)

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

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

这有道理吗?

有用的链接:scanfsscanf