假设您有一个字符串:
std::string s = "ABCD\t1234";
我可以使用
std::string::find
来获取'\ t'字符的偏移量,但是据我所知,没有具有以下签名的函数:int atoi_n(char *, int len);
我错过了什么吗?
strtok
用\t
替换\0
,我不想触摸原始缓冲区。我很难相信,没有atoi
,atof
等带有长度参数的实例,但是我什么也找不到。有人知道我想念什么吗?我知道boost有一些标记器,但我想避免不得不添加boost的依赖项。
看到目前为止的评论,我想澄清一下。让我们更改方案:
字符缓冲区[1024];
char * pStartPos;
char * pEndPost;
pStartPos =缓冲区+ 5;
pEndPos =缓冲区+ 10;
假设您无法对pStartPos和pEndPos之外的内存做任何假设。如何将pStartPos和pEndPos之间的字符转换为int而不将'\ 0'添加到缓冲区或使用substr复制?
最佳答案
如果您只想解析字符串的结尾(从\t
之后的字符到结尾),则只需要传递一个指向第一个字符的指针即可解析到atoi
...
int n = atoi(s.c_str()+s.find('\t')+1);
(为简洁起见,省略了错误检查-特别是,我们始终假定实际上存在
\t
)相反,如果您要从字符串的开头解析到
\t
,则可以执行int n = atoi(s.c_str());
因为
atoi
总是以第一个非数字字符停止。顺便说一句,您应该考虑使用更强大的解决方案来解析数字,例如
strtol
,sscanf
或C ++流-它们都可以以某种方式报告解析错误,而atoi
只是返回0
(与解析字符串所得的0不能区分)。顺便说一句,
atoi
绝对不在“ STL”中-只是C标准库的一部分。我知道atoi不在STL中。我想知道STL中是否有类似的内容,您可以在其中指定要包含在转换中的最后一个字符。基本上,我有一个缓冲区,其中可能部分填充了垃圾。我知道可能有效数据的开始和可能有效数据的结束。我不想依靠空格来结束转换,我想明确说明“字段”的长度,因为它也可能不会以/ 0结尾。
如果确定垃圾不是以数字开头,则可以按原样使用
atoi
/ strtol
/ istringstream
-它们在看到垃圾时会自动停止。否则,使用substr
方法提取所需的确切子字符串:std::string mayContainGarbage="alcak123456amaclmò";
std::string onlyTheDigits=mayContainGarbage.substr(5, 6);
// now parse onlyTheDigits as you prefer
关于c++ - STL中是否有任何函数可以执行字符串转换,但是具有长度参数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17605213/