假设您有一个字符串:

std::string s = "ABCD\t1234";


我可以使用std::string::find来获取'\ t'字符的偏移量,但是据我所知,没有具有以下签名的函数:

int atoi_n(char *, int len);


我错过了什么吗? strtok\t替换\0,我不想触摸原始缓冲区。我很难相信,没有atoiatof等带有长度参数的实例,但是我什么也找不到。

有人知道我想念什么吗?我知道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总是以第一个非数字字符停止。

顺便说一句,您应该考虑使用更强大的解决方案来解析数字,例如strtolsscanf或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/

10-10 21:28