使用指针指向字符串中的某些字符

时间:2015-07-21 12:55:06

标签: c++ string pointers substring

#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编译器。这只是我正在使用字符串数据类型的其他更大程序的一小部分,所以我现在可以做什么,非常感谢回答我的问题:)

6 个答案:

答案 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结尾,即\0s2的开头很好但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;
}