C++ C++;-如何将char*子字符串解析为int?
我正在处理一个模拟文件。该文件有许多行,其中包含数字、字母和字符 例如:C++ C++;-如何将char*子字符串解析为int?,c++,string,parsing,C++,String,Parsing,我正在处理一个模拟文件。该文件有许多行,其中包含数字、字母和字符 例如: GR123,7894.5444,A,4687.5643,P GR456,1234.6556,A,9657.5686,P GR789,2344.3422,A,9786.8465,P GR987,6522.6354,A,3245.5754,P 我需要取A和p之前的值(对于第一行,7894.5444和4687.5643) 如何通过将此字符串定位为int来解析?已试用过: double e
GR123,7894.5444,A,4687.5643,P
GR456,1234.6556,A,9657.5686,P
GR789,2344.3422,A,9786.8465,P
GR987,6522.6354,A,3245.5754,P
我需要取A和p之前的值(对于第一行,7894.5444和4687.5643)
如何通过将此字符串定位为int来解析?已试用过:
double exampleA = stoi(row.substr(6,9));
double exampleP = stoi(row.substr(18,9));
但是它给了我这个错误:请求'row'中的成员'substr',它是非类类型'char*'
还尝试:
char exampleA[9];
char exampleP[9];
memcpy(&exampleA, &row[6],sizeof(exampleA));
memcpy(&exampleP, &row[6],sizeof(exampleP));
为了在将值与行分离后进行转换,但memcpy缓冲区始终会将exampleP的值与exampleA类似:
A : 7894.5444
P : 4687.5643?7894.5444
请求“行”中的成员“substr”,该成员为非类类型“char*”
是的,你不能在指针上调用substr
。也许您想将这些东西存储在std::string
实例中
至于你的第二次尝试,你写的东西有很多大问题:
memcpy
复制字符串。更好的第一次尝试是strncpy
将子字符串复制到缓冲区,尽管您仍然需要手动将其终止为null
p
行显示这两个条目的原因是编译器似乎将exampleA
放在堆栈上的exampleA
之后,由一个保护字符分隔,并且由于没有null终止字符串,因此试图显示exampleA
溢出到exampleA
,完全出于运气,它后面似乎跟有一个空字符。由于数据似乎是C字符串,您不妨使用它,它的优点是不需要您复制子字符串:
char* endp;
double exampleA = std::strtod(row+6, &endp);
double exampleP = std::strtod(row+18, &endp);
在这两种情况下,您可能需要仔细检查*endp==','
,并且没有显示任何转换错误
当然,即使使用std::string
,也可以使用std::strod
。这通常是最有效的解决方案
请注意,strtod
具有区域设置意识,因此如果输入与当前区域设置不一致(例如,文件使用句点fir小数和逗号作为字段分隔符,而区域设置分别使用逗号和分号),则这可能不起作用
我不知道你把浮点数转换成整数是什么意思(截断?舍入?乘以10000?)。所以我没有回答这部分问题。您试图使用
std::string
语法来表示char*
,为什么不首先使用std::string
?它不是CSV而是TXT文件。我将尝试调整这个问题的答案。我使用strncpy也有同样的问题。你不能帮助我使用代码吗?你有空终止你的字符串吗?没有,因为我已经收到了那种格式的txt文件。我应该在迭代中添加“\0”吗?“不,因为我已经收到了那种格式的txt文件”——这与您的文件无关,在C中,所有字符串都必须以null结尾。它返回错误错误:无法基于转换为“char**”类型来解析重载函数“end”
您使用命名空间std执行代码>并获取问题。我把end
改为endp
,以防万一。但是我同意使用名称空间std代码>产生的问题超过了它的价值。