【问题标题】:Finding the length of a C style char * string in c++ [duplicate]在c ++中查找C样式char *字符串的长度[重复]
【发布时间】:2017-04-16 13:11:29
【问题描述】:

这个程序的重点是反转一个字符串并将其打印出来。这是一项学校作业,我才刚刚开始。我需要反转给我的字符串(整个主函数是为赋值给出的),我需要使用 2 个指针作为 cstring 的开头和 cstring 的结尾。在代码中,我知道传递的 cstring 的开头只是“temp”,但我不知道如何找到 cstring 的结尾字母并为其分配一个指针。

主要功能交给我了:

#include <iostream>
#include "reverse.hpp"

using namespace std;
void reverse(char*);

int main()
{
    // these are the test cases
    char str1[] = "time";
    char str2[] = "straw";
    char str3[] = "deliver";
    char str4[] = "star";
    char str5[] = "knits";

    cout << "The strings before reversing: " << endl;
    cout << str1 << " " << str2 << " " << str3 << " " << str4 << " " << str5 << " " << endl;

    reverse(str1);
    reverse(str2);
    reverse(str3);
    reverse(str4);
    reverse(str5);

    cout << "The strings after reversing: " << endl;
    cout << str1 << " " << str2 << " " << str3 << " " << str4 << " " << str5 << " " << endl;

    return 0;

}

这里是反向函数:

#ifndef REVERSE_HPP
#define REVERSE_HPP
#include <string.h>

void reverse(char*temp)
{
    // *temp would equal "t" in the first cstring
    // (sizeof *temp - 1) would equal last character ???

}

#endif // REVERSE_HPP

这与发布的其他内容不同,因为我试图用指针获取长度

【问题讨论】:

  • 尝试一些事情,打印结果,以便您了解发生了什么。你可以增加一个指针。试试看,通过打印出内容来查看它所指向的内容。实验。
  • 这就是 strlen 的用途。 linux.die.net/man/3/strlen
  • char str1[] = "time"; 等价于char str1[5] = {'t', 'i', 'm', 'e', '\0'};

标签: c++ c++11 pointers


【解决方案1】:

无法通过指针找到数组的长度。但是您的数组是从字符串文字初始化的,c 和 c++ 中的字符串有一种特殊的存储方式,可以让您确定它的长度。

字符串被定义为非null 字符后跟null 字符的序列,因此要查找字符串的长度,您只需遍历字符直到找到'\0',例如这个

size_t length = 0;
while (str[length] != '\0')
    ++length;

你当然可以使用c标准库提供的strlen()函数,可以在string.h头文件中找到。

【讨论】:

  • 这真是个XY问题,他需要的是字符串的长度,不是求数组长度的通用方法
  • 我更改了问题标题 - 以完全清楚 OP 的真正要求
  • 重点是给字符串的前后分配指针,对所有的cstrings使用reverse函数。如果我不需要反向函数为所有 cstrings 工作,则使用 strlen 会起作用
  • @nbarbop24 我不确定您是如何实现反向功能的。知道 c 字符串的长度,您就可以正确地初始化指向末尾的指针。
  • 我将 cstring 传递给 reverse 函数,并将 cstring 分配给指针。我需要找到指针传递的 cstring 的长度。例如,strlen(*temp) 将不起作用
【解决方案2】:

只是为了完整性

void reverse(char*temp)
{
    int l = strlen(temp);
  .....
}

为了获得额外的功劳,请使用 c++ 字符串重新实现整个赋值(也包括 main),这是您应该在 c++ 中使用的。还将字符串放在一个向量中,而不是 n 个单独的变量中。

叹气——我看到其他人已经为你做了第一个。你仍然可以让反向函数在 std::string 而不是 c_str() 上工作。请注意,c++ 为您提供了一个可以反转字符串的 oneliner - 找到它以获得额外的额外信用

【讨论】:

    【解决方案3】:

    在 c++ 中,你想使用 std::string

    #include <string>
    #include <iostream>
    #include "reverse.hpp"
    
    using namespace std;
    
    // why the declaration here?
    // (I would presume this goes in "reverse.hpp" ?)
    void reverse(std::string& str);
    
    int main()
    {
      string str1 = "time";
      string str2 = "straw";
      string str3 = "deliver";
      string str4 = "star";
      string str5 = "knits";
    
      cout << "The strings before reversing: " << endl;
      cout << str1 << " " << str2 << " " << str3 << " " << str4 << " " << str5 << " " << endl;
    
      reverse(str1);
      reverse(str2);
      reverse(str3);
      reverse(str4);
      reverse(str5);
    
      cout << "The strings after reversing: " << endl;
      cout << str1 << " " << str2 << " " << str3 << " " << str4 << " " << str5 << " " << endl;
    
      return 0;
    }
    

    别忘了改变

    reverse(const char*);
    

    到 反向(std::string&);

    std::string 非常易于使用,并且与指针不同,它可以携带您所需要的一切。

    【讨论】:

    • 那么应该是std::string reverse( const std::string &amp;str )
    • @Slava,我同意,我只是提出了 void reverse( std::string& str );更紧密地匹配问题,但我也会使用您使用的原型来做到这一点。
    猜你喜欢
    • 1970-01-01
    • 2015-02-22
    • 2012-08-07
    • 2022-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多