c++builder - 检查 AnsiString 末尾的字符(如果找到),删除它
问题描述
我想检查 AnsiString 是否有特定的最后一个字符(在本例中为“f”),如果找到它,则修改 AnsiString 以将其删除
它可能很明显,但到目前为止我的搜索还没有奏效。
从磁盘读取的典型字符串可能是:
“暴击“主甲板船尾”37.80f 2.12 11.92”
您会看到一个数字有一个“f”作为后缀,但情况并非总是如此。在这种情况下,我想删除它。
我还想检查第一个字符是否为“-”为负数,但首先需要删除后缀“f”,然后再将其转换为浮点数。
我尝试的最后一种方法是编译但不会触发if is
char buffer[256];
char *Buf, *Buf6, *Buf7, *Buf8, *Buf9, *Buf10;
fgets(buffer,200,disk);
if (strncmp(buffer,"crit \"",6) == 0)
{
CritCounter += 1;
Buf = strtok(buffer,"\"");
Buf6 = strtok(NULL,"\"");
Buf7 = strtok(NULL," ,\t");
Buf8 = strtok(NULL," ,\t");
Buf9 = strtok(NULL," ,\t");
Buf10 = strtok(NULL,"\n");
AnsiString LongPos(Buf7);
if (AnsiLastChar(LongPos) == "f")
{
LongPos.SetLength( LongPos.Length()-1 );
}
提前致谢
发表已编辑
这行得通。只是首先将最后一个字符分配给一个新的 AnsiString,然后在if工作中使用该 AnsiString
我看不出它应该有什么不同
AnsiString LongPos(Buf7);
AnsiString LastChar = AnsiLastChar(LongPos);
if (LastChar == "f")
{
LongPos.SetLength( LongPos.Length()-1 );
}
与 if () == "f" 没有触发的情况相反
AnsiString LongPos(Buf7);
if (AnsiLastChar(LongPos) == "f")
{
LongPos.SetLength( LongPos.Length()-1 );
}
解决方案
AnsiLastChar()
(独立函数和AnsiString
类方法)返回一个char*
指向最后一个字符的指针。您不需要将该指针分配给另一个 AnsiString
以进行比较,只需取消引用该指针即可,例如:
char *LastChar = LongPos.AnsiLastChar();
if (*LastChar == 'f')
...
您不能直接将该指针与另一个字符指针进行比较以检查它们是否具有相同的字符值。这就是为什么if (AnsiLastChar(LongPos) == "f")
总是假的。字符串文字就像"f"
是一个衰减为指针的const char[]
数组。将两个指针相互比较只是比较它们的内存地址,而不是它们指向的数据的内容。返回的内存地址永远不会等于字符串文字的内存地址。const char*
AnsiLastChar()
推荐阅读
- ruby-on-rails - 尝试将博客保存到数据库时,@blog.save 返回 false
- gerrit - 格里特无视詹金斯的反对票
- css - Pan/scroll image image inside a div container
- sql - 用过程替换触发器
- maven - 排除 AnnotationProcessorPaths 中的依赖项
- c# - 如何使用 automapper 9.0.0.0 根据句柄属性自动映射两个列表
- sql-server - 使用 Azure Data Lake Store Gen1 中的 SSIS 包将文件从一个目录移动到另一个目录
- wordpress - 仅删除单页上的 Yoast Breadcrumb 最后一项
- vba - 是否可以将先前代码生成的文件名用作下一行代码的变量?
- sql-server - 解析 SQL 脚本以查找表依赖项和输出