#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;
}
我想要那个cout&lt;&lt; * s2;应该只打印其中的字母{“develop”},所以我将* s2 [8]的长度设为8个字符。我该怎么做才能使变量cout&lt;&lt; * s2只打印8个字符的长度。我正在使用dmc,lcc和OpenWatcom编译器。这只是我正在使用字符串数据类型的其他更大程序的一小部分,所以我现在可以做什么,非常感谢回答我的问题:)
答案 0 :(得分:5)
s2
是指向char
的长度为8的数组。从第10位开始,你的第一个元素指向s1
。这就是全部。您没有使用该数组的其余元素。因此s2
的长度无关紧要。
你可以这样做:
char* s2 = &s1[10];
如果您想要创建s1
部分字符串,可以使用std::string
:
std::string s3(s1+10, s1+19);
std::cout << s3 << endl;
请注意,这会分配自己的内存缓冲区并保存副本或原始字符序列。如果您只想要查看另一个字符串的一部分,则可以轻松实现一个包含begin和一个指向原始结尾的指针的类。这是一个粗略的草图:
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;
}
答案 1 :(得分:1)
s2
是指向char*
的指针数组。您只使用此数组中的第0个元素。
&s1[10]
指向字符串s1
中的第11个字符。该地址被分配给s2
的第0个元素。
在cout
声明中,*s2
相当于s2[0];
。因此cout << *s2;
输出s2
的第0个元素,该元素已分配给s1
的第11个字符。 cout
将沿着内存滚动,直到到达字符串的空终止符。
答案 2 :(得分:1)
字符串必须以NULL结尾,即\0
。 s2
的开头很好但cout会继续阅读直到结束。如果想要输出,则必须实际复制数据而不是简单地设置指针。
答案 3 :(得分:1)
你的错误在想
char *s2[8];
声明一个指向8个字符数组的指针(或者,不是等效地指向一个字符串,指向完全为8个字符的指针)。它没有做其中任何一个。它不是声明一个指向数组的指针,而是声明一个指针数组。
如果您希望s2
成为指向8个字符数组的指针,则需要:
char (*s2)[8];
但是,这仍然搞砸了。你问:
我能做什么,以便变量* s2只存储长度?
你认为它的长度是8吗?在尝试回答之前,请回到您对s1
:
char s1[80]={"This is a developed country."};
长度是80还是28?答案是,或者取决于你如何定义&#39;长度&#39; - 数组的长度或空终止符的长度?
所有这些关于尺寸的误解都是无益的。作为@ n.m.在评论中指出,C ++中所有指针问题的解决方案是停止使用指针。 (如果我错误地解释了,请道歉!)
#include<iostream>
using namespace std;
int main()
{
string s1="This is a developed country.";
string s2;
s2 = s1.substr(10, 9);
cout << s2;
return 0;
}
答案 4 :(得分:1)
如果你想做ghetto样式并因某些原因跳过std :: string你总是可以使用strncpy,memcpy或strstr等。
int main()
{
char s1[80]="This is a developed country.";
char s2[10];
strncpy(s2,s1+10,9);
s2[9] = '\0';
std::cout << s2 << std::endl;
std::cin.get();
return 0;
}
答案 5 :(得分:1)
s2是char类型的arry,arry的元素是char *,因此您不能使用它来存储字符串。如果你想在字符串中获得“开发”,你可以编写类似的代码:
#include<iostream>
using namespace std;
int main()
{
char *s1[]={"This", "is", "a", "developed", "country."};
char *s2[8];
s2[0]= s1 + 3;
cout<<s2[0]; //Predicted OUTPUT: developed
// Actual OUTPUT: developed country.
return 0;
}