【问题标题】:Pointing to a some characters in a string using pointer使用指针指向字符串中的某些字符
【发布时间】:2015-10-10 22:33:54
【问题描述】:
#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

【问题讨论】:

  • s2 是一个由 8 个 char 指针组成的数组。 *s2 就是这样一个指针。 char 指针不存储字符,它指向它们。 char 数组存储字符。
  • 您为什么预测输出“已开发”?你以为“发达”有8个字吗?它有 9 个。(或 10 个,但这是一个不同的对话。)它绝对没有 8 个字符。
  • 还必须注意:不要在 C++ 中使用数组和指针。它有std::string,这是您应该使用的数据类型。

标签: c++ string pointers substring


【解决方案1】:

s2 是一个长度为 8 的指针数组,指向 char。您将其第一个元素指向s1,从位置 10 开始。仅此而已。您没有使用该数组的其余元素。因此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;
}

【讨论】:

  • 谢谢,但由于某种原因我不能使用字符串 DT,实际上我正在创建一个搜索算法来搜索文件中的某些给定字符串,我的逻辑是 >>>>>> > 在输入模式下获取文件,使用 get(line,80,'delim'); ,我会在其中找到要搜索的字符串,所以我将从 line[80] 创建子字符串。
【解决方案2】:

s2 是指向char* 的指针数组。您只使用了此数组中的第零个元素。

&amp;s1[10] 指向字符串s1 中的第11 个字符。该地址被分配给s2 的第零个元素。

cout 语句中,*s2 等价于s2[0];。所以cout &lt;&lt; *s2; 输出s2 的第0 个元素,它已经分配给s1 的第11 个字符。 cout 将沿着内存滚动,直到到达字符串的空终止符。

【讨论】:

    【解决方案3】:

    字符串必须以 NULL 结尾,也就是 \0s2 的开头很好,但 cout 将继续阅读直到结束。如果您希望能够输出,则必须实际复制数据而不是简单地设置指针。

    【讨论】:

      【解决方案4】:

      你的错误是这样想的

      char *s2[8];
      

      声明一个指向 8 个字符的数组的指针(或者,not 等效地,一个指向一个精确到 8 个字符的字符串的指针)。它不做那些。它不是声明一个指向数组的指针,而是声明一个指针数组。

      如果您希望 s2 成为指向 8 个字符数组的指针,您需要:

      char (*s2)[8];
      

      但是,这仍然一团糟。你问:

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

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

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

      长度是 80 还是 28?答案是,取决于您如何定义“长度” - 数组的长度或到空终止符的长度?

      所有这些关于尺寸的误解都无济于事。作为@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;
      }
      

      【讨论】:

        【解决方案5】:

        如果您想使用 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;
        }
        

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            猜你喜欢
            • 2013-04-26
            • 2021-06-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-10-30
            • 2011-04-12
            • 1970-01-01
            相关资源
            最近更新 更多