C++中LastDelimiter的疑惑

kkevince 2016-07-23 12:36:16
我是一个新手,拿起这门语言时间不长,昨天学习过程中遇到一个疑惑,我要从一个AnsiString中截取一段子串,用到了LastDelimiter来做截取起始点的标记
AnsiString name = F:\music\kugou\abcde.mp3 //歌曲路径名
int a = name.LastDelimiter("\");
int b = name.LastDelimiter(".");
Label1->Caption=name.SubString(a,b); //标签显示mp3的名字,也就是我要显示abcde

运行就报错[C++ Error] Unit1.cpp(26): E2380 Unterminated string or character constant,我一个朋友给我改了三个地方:
1、("\")改成了("\\")
2、int a = name.LastDelimiter("\\")+1;
3、Label1->Caption = name.SubString(a,(b-a))+1;
之后成功运行,我就纳闷了,查了书籍,LastDelimiter的返回值为制定字符在串中的位置即“\”的位置索引,他的“\\”哪来的,而且返回的值还要+1,另外substring不是截取指定位置即a和b之间的字串,为什么表达式变成了(a,(b-a))?

求前辈们指点下小弟,谢谢!
...全文
402 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
缘中人 2016-07-29
  • 打赏
  • 举报
回复
char sz[] = R"(F:\music\kugou\abcde.mp3)"; // 一定要注意C++11或更高版本才支持
ooolinux 2016-07-23
  • 打赏
  • 举报
回复
引用 5 楼 u010165006 的回复:
用函数可以吗? ⑶ExtractFileName() 原型:extern PACKAGE AnsiString __fastcall ExtractFileName(const AnsiString FileName); 功能:从文件名中抽取不含路径的文件名 参数:FileName:要处理的文件名 例:ShowMessage(ExtractFileName("c://Winnt//SOL.EXE"));//显示"SOL.EXE"
上面例子错了,应该是: ShowMessage(ExtractFileName("c:\\Winnt\\SOL.EXE"));//显示"SOL.EXE"
ooolinux 2016-07-23
  • 打赏
  • 举报
回复
用函数可以吗? ⑶ExtractFileName() 原型:extern PACKAGE AnsiString __fastcall ExtractFileName(const AnsiString FileName); 功能:从文件名中抽取不含路径的文件名 参数:FileName:要处理的文件名 例:ShowMessage(ExtractFileName("c://Winnt//SOL.EXE"));//显示"SOL.EXE"
kkevince 2016-07-23
  • 打赏
  • 举报
回复
我刚测试了一下,如果定义为substring(a+1,(b-a-1)); 得出来的结果是“abcd”少了e, 所以推出substring是从\后的那个字符开始截的,然后目标字串长度是b-a。 而且substring好像有几种表达方式: substring(子串起始位置,子串终止位置)// substring(a,b) substring(子串起始位置,子串长度)// substring(a,(b-a)) substring(子串起始位置)// substring(a) 截取a开始后面的字符串 题中用的是substring(a,(b-a)), 为什么用(a,b)不能截取出来呢?
kkevince 2016-07-23
  • 打赏
  • 举报
回复
原来是这样啊,谢谢前辈,现在明白了。 那几个函数都查过资料定义,就是跟资料的定义不一样所以才有疑惑,关键是运行结果也是对的。
ccrun.com 2016-07-23
  • 打赏
  • 举报
回复
首先在C++中默认\是转义符,用来定义个字符串表示路径的话,得用两个\\字符,如 F:\\music\\kugou\\abcde.mp3 除非启用C++11新特性,可以用RAW字符串,这样\就表示反斜杠,而不是转义符了,如 char sz[] = R"(F:\music\kugou\abcde.mp3)"; // 一定要注意C++11或更高版本才支持 在你这个示例代码里,a 的值是name字符串最后一个\的位置,值为15,b是name字符串最后一个.的位置,值是21,你要获取abcde这个文件名字符串的话,应该是从最后一个\的位置的下一个字符开始算,也就是a+1,然后截取的字符串长度应该是从最后一个\到最后一个.的长度,也就是b-a-1=5个字符。正确的代码:
AnsiString name = "F:\\music\\kugou\\abcde.mp3";
int a = name.LastDelimiter("\\");
int b = name.LastDelimiter(".");
Label1->Caption = name.SubString(a + 1, b - a - 1);
dataxdata 2016-07-23
  • 打赏
  • 举报
回复
C/C++中,一些特殊字符要在前面加反斜杠‘\’以示区别,如‘\r', '\n', '\0'等,称为转义字符,因此反斜杠本身也要写成'\\',否则就混淆了 另外几个问题建议LZ仔细查一下这几个函数的说明就清楚了

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧