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

Pointing to a some characters in a string using pointer

本文关键字:字符 字符串 指针      更新时间:2023-10-16
#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结束,即s2的开始很好,但cout将继续读取直到结束。如果您希望能够输出,则必须实际复制数据,而不是简单地设置指针。

你的错误是认为

char *s2[8];

声明了一个指向8个字符数组的指针(或者,不是,等价地,一个指向恰好有8个字符的字符串的指针)。它不做这两件事。它声明的不是指向数组的指针,而是指针数组。

如果你想让s2是一个指向8个字符数组的指针,你需要:

char (*s2)[8];

但是,这仍然是混乱的。你问:

我怎么做才能使变量*s2只存储到它的长度?

你认为它的长度是8吗?在尝试回答这个问题之前,请回到您对s1的定义:

char s1[80]={"This is a developed country."};

长度是80还是28?答案是要么,取决于你如何定义'长度' -数组的长度或长度到空终止符?

所有这些关于尺寸的误解都是无益的。@n.m。在评论中指出,c++中所有指针问题的解决方案是停止使用指针。(如果我曲解了n.m.,我道歉!)

#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;
}

如果你想用贫民窟的风格,因为某种原因跳过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] = '';
    std::cout << s2 << std::endl;
    std::cin.get();
    return 0;
}

s2是一个char类型的数组,数组的元素是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;
}