【问题标题】:Get part of a char array获取字符数组的一部分
【发布时间】:2011-06-14 05:09:24
【问题描述】:

我觉得这是一个非常愚蠢的问题,但我似乎无法在任何地方找到答案!

是否可以从一个字符数组中获取一组字符?扔掉一些伪代码:

char arry[20] = "hello world!";
char part[10] = arry[0-4];
printf(part);

输出:

hello

那么,我可以从这样的数组中获取一段字符,而无需循环并逐个字符地获取它们或转换为字符串,以便我可以使用 substr() 吗?

【问题讨论】:

    标签: c++ arrays char


    【解决方案1】:

    简而言之,没有。 C 风格的“字符串”根本不能那样工作。您要么必须使用手动循环,要么使用strncpy(),或者通过 C++ std::string 功能来实现。既然你在 C++ 中,你也可以用 C++ 字符串来做任何事情!

    旁注

    碰巧,对于您的特定示例应用程序,您可以通过printf() 提供的功能简单地实现这一点:

    printf("%.5s\n", arry);
    

    【讨论】:

    • 好吧,那太糟糕了。哦,好吧,我可以转换为字符串,我只是想知道是否有更...​​优雅的解决方案。我正在修剪 char 数组的一部分以供以后使用,因此仅使用 printf 的能力并不能解决它。但无论如何,谢谢你的花絮,我不知道,它可能会派上用场!
    • @Curlystraw:@Moo-Juice 的回答使用 C++ 字符串,如果你问我,它非常优雅!
    【解决方案2】:

    您可以使用memcpy(或strncpy)来获取子字符串:

    memcpy(part, arry + 5 /* Offset */, 3 /* Length */);
    part[3] = 0; /* Add terminator */
    

    在代码的另一个方面,请注意,如果 str 包含不受信任的输入,则执行 printf(str) 可能会导致格式字符串漏洞。

    【讨论】:

      【解决方案3】:

      正如 Oli 所说,您需要使用 C++ std::string 功能。在您的示例中:

      std::string hello("Hello World!");
      std::string part(hello.substr(0, 5)); // note it's <start>, <length>, so not '0-4'
      
      std::cout << part;
      

      【讨论】:

        【解决方案4】:

        嗯,您确实提到了两种明显的方法。我唯一能想到的就是定义自己的子字符串类型来处理字符数组:

        struct SubArray
        {
            SubArray(const char* a, unsigned s, unsigned e)
                :arrayOwnedElseWhere_(a),
                start_(s),
                end_(e)
            {}
            const char* arrayOwnedElseWhere_; 
            unsigned start_;
            unsigned end_;
            void print()
            {
                printf_s("%.*s\n", end_ - start_ + 1, arrayOwnedElseWhere_ + start_);
            }
        };
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-06-13
          • 1970-01-01
          • 2021-06-13
          • 1970-01-01
          相关资源
          最近更新 更多