检查 AnsiString 末尾的字符(如果找到),将其删除
Checking for a character at end of AnsiString (and if finding), deleting it
我想检查 AnsiString 中的特定最后一个字符(在本例中 "f"),如果找到它,则修改 AnsiString 以将其删除
它可能很明显,但到目前为止我的搜索还没有奏效。
它从磁盘读取的典型字符串可能是:
"crit "Main Deck Aft" 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 );
}
提前致谢
Post 已编辑
这成功了。仅仅首先将最后一个字符分配给一个新的 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()
(两者都是standalone function, and the AnsiString
class method)returns一个char*
指向最后一个字符的指针。您不需要将该指针分配给 another AnsiString
以便对其进行比较,只需 取消引用 指针即可,例如:
char *LastChar = LongPos.AnsiLastChar();
if (*LastChar == 'f')
...
您不能直接将该指针与另一个字符指针进行比较以检查它们是否具有相同的字符值。这就是为什么 if (AnsiLastChar(LongPos) == "f")
总是错误的。像 "f"
这样的字符串文字是一个 const char[]
数组,它 衰减 成一个 const char*
指针。比较两个指针彼此只是比较它们的内存地址,而不是它们指向的数据的内容。 AnsiLastChar()
returns 的内存地址永远不会等于字符串文字的内存地址。
我想检查 AnsiString 中的特定最后一个字符(在本例中 "f"),如果找到它,则修改 AnsiString 以将其删除
它可能很明显,但到目前为止我的搜索还没有奏效。
它从磁盘读取的典型字符串可能是:
"crit "Main Deck Aft" 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 );
}
提前致谢
Post 已编辑
这成功了。仅仅首先将最后一个字符分配给一个新的 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()
(两者都是standalone function, and the AnsiString
class method)returns一个char*
指向最后一个字符的指针。您不需要将该指针分配给 another AnsiString
以便对其进行比较,只需 取消引用 指针即可,例如:
char *LastChar = LongPos.AnsiLastChar();
if (*LastChar == 'f')
...
您不能直接将该指针与另一个字符指针进行比较以检查它们是否具有相同的字符值。这就是为什么 if (AnsiLastChar(LongPos) == "f")
总是错误的。像 "f"
这样的字符串文字是一个 const char[]
数组,它 衰减 成一个 const char*
指针。比较两个指针彼此只是比较它们的内存地址,而不是它们指向的数据的内容。 AnsiLastChar()
returns 的内存地址永远不会等于字符串文字的内存地址。