使用指针指向字符串中的某些字符
Pointing to a some characters in a string using pointer
#include<iostream>
using namespace std;
int main()
{
char s1[80]={"This is a developed country."};
char *s2[8];
s2[0]=&s1[10];
cout<<*s2; //Predicted OUTPUT: developed
// Actual OUTPUT: developed country.
return 0;
}
我想要这个count <<*s2;应该只打印其中的字母{"developed"},所以我给出了*s2[8]长度为8个字符。我该怎么做才能使变量cout<<*s2只打印8个字符的长度?我使用dmc, lcc和OpenWatcom编译器。这只是我使用字符串数据类型的其他更大程序的一小部分,所以我现在能做什么呢?非常感谢您回答我的问题:)
s2
是一个长度为8的指向char
的指针数组。你让它的第一个元素指向从位置10开始的s1
。就这些。您没有使用该数组的剩余元素。因此,s2
的长度是无关的。
你可以这样做:
char* s2 = &s1[10];
如果你想用s1
的一部分创建一个字符串,你可以使用std::string
:
std::string s3(s1+10, s1+19);
std::cout << s3 << endl;
注意,它分配自己的内存缓冲区,并保存原始字符序列的副本。如果你只想要另一个字符串的一部分的视图,你可以很容易地实现一个类,它包含一个起始和结束指针指向原始的指针。这里是一个粗略的草图:
struct string_view
{
typedef const char* const_iterator;
template <typename Iter>
string_view(Iter begin, Iter end) : begin(begin), end(end) {}
const_iterator begin;
const_iterator end;
};
std::ostream& operator<<(std::ostream& o, const string_view& s)
{
for (string_view::const_iterator i = s.begin; i != s.end; ++i)
o << *i;
return o;
}
然后int main()
{
char s1[] = "This is a developed country.";
string_view s2(s1+10, s1+19);
cout << s2 << endl;
}
s2
是指向char*
的指针数组。您只使用了这个数组中的第0个元素。
&s1[10]
指向字符串s1
中的第11个字符。该地址被赋给s2
的第0个元素。
在cout
语句中,*s2
相当于s2[0];
。因此,cout << *s2;
输出s2
的第0个元素,该元素被赋值给s1
的第11个字符。cout
将沿着内存运行,直到到达字符串的null结束符。
字符串必须以NULL结束,即