该方法std::basic_string::substr具有参数pos, count,指定位置[pos,pos + count + 1]中元素的逻辑范围.相反,大多数标准库函数(例如std::for_each)都有一些类似的参数begin, end,指定范围[begin,end]
这似乎是一个例外,然后,让一些人感到困惑(请参阅此处,此处,此处和此处的问题).为什么这里没有采用通常的范围惯例?std::vector::erase另请注意,另一个随机访问容器的方法确实遵循通常的惯例.
可能重复:
C++ string.substr()函数问题
string s = "0123456789";
cout<<s.substr(0,4)<<endl;
cout<<s.substr(4,7)<<endl;
Run Code Online (Sandbox Code Playgroud)
上面代码行的输出非常出乎意料,s.substr(0,4)给了我"0123",s.substr(4,7)给了我"456789".它只期待"456".我在这里遗漏了什么,并且在C++中有替代substr函数的方法,在第二次调用时只给出"456".
我正在尝试打印字符串的子字符串,但 substr() 函数的行为对我来说似乎很奇怪。
在我的下面的程序中,我试图打印值为“Kamal”的字符串的子字符串。
在这里,substr(0,4) 打印“Kama”,这让我假设 0 是包含的,4 是排除的。但是 substr(1,4) 打印“amal”,这违反了我的上述理解,因为位置 4 中的字符被打印,而在之前的情况下却没有打印。你能解释一下这种奇怪的行为吗?
如果这个问题真的很愚蠢,那么这是我第一次使用 substr()。我在网上搜索过,但似乎找不到任何有用的答案。
#include<iostream>
#include<string>
using namespace std;
int main() {
string s1 = "Kamal";
cout << s1.substr(0, 4) << '\n';
cout << s1.substr(1, 4) << '\n';
return 0;
}
Run Code Online (Sandbox Code Playgroud)