我有以下问题。我想将像"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;
有人可以解释一下它的工作原理吗?我们为什么要将len
(int
)添加到字符串?
答案 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;
正在递增变量line
,sscanf
line + =len;
只是line =line+ len;
答案 2 :(得分:0)
sscanf(line,“%d%n”,&amp; num,&amp; len)
此行从行读取一个数字,并将数字放入num和读入len的字符数。
我们需要len来将指针移动到字符串的未读部分。
有意义吗?
答案 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读取的字符数存储在指向的位置。
所以你从字符串读取整数和这个整数组成的字符数。
读完部分字符串后,将指针移动到读取字符数。