检查AnsiString末尾的字符(如果找到),将其删除

时间:2018-08-23 07:47:27

标签: c++builder ansistring

我想检查AnsiString是否存在特定的最后一个字符(在本例中为“ f”),如果找到它,则修改AnsiString以将其删除

这可能很明显,但是到目前为止,我的搜索没有成功。

从磁盘读取的典型字符串可能是:

“暴击”主甲板尾部“ 37.80f 2.12 11.92”

您将看到一个数字带有后缀“ f”,但这并非总是如此。在这种情况下,我想将其删除。

我还想检查第一个字符是否为“-”,是否为负数,但首先需要先删除后缀“ f”,然后再将其转换为浮点数。

我尝试的最后一个方法是,它可以编译但不会触发 if

      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,然后在如果有效的情况下使用该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 );
      }

1 个答案:

答案 0 :(得分:0)

AnsiLastChar()standalone functionAnsiString class method两者)向最后一个字符返回char* pointer 。您无需将该指针分配给另一个 AnsiString即可进行比较,只需取消引用即可,例如:

char *LastChar = LongPos.AnsiLastChar();
if (*LastChar == 'f')
    ...

您不能直接将该指针与另一个字符指针进行比较,以检查它们是否具有相同的字符值。这就是if (AnsiLastChar(LongPos) == "f")始终为假的原因。像"f"这样的字符串文字是一个const char[]数组,它会衰减成为const char*指针。将两个指针相互比较只会比较它们的内存地址,而不是它们所指向的数据的内容。 AnsiLastChar()返回的内存地址永远不会等于字符串文字的内存地址。