【问题标题】:Copy and reverse char* in the C++在 C++ 中复制和反转 char*
【发布时间】:2014-03-22 16:24:34
【问题描述】:

我想将反向的char* 复制到另一个char*。我错过了输出第二行中的一个字母。

我做到了:

#include <iostream>

using namespace std;

void cp(char *str2, char *str1){
    char *pom1 = str1;
    while(*pom1){
        pom1++;
    }
    char* pom2 = str2;
    while(*pom1 != *str1){
         pom1--;
        *pom2 = *pom1;
         pom2++;
    }
    *pom2 = '\0';
}

int main()
{
    char *str1 = "ppC", str2[10] = "Witaj";
    cout << "Napis str2 "<< str2 << endl;
    cp(str2,str1);
    cout << "Napis str2 "<< str2 << endl;
    cp(str2,"CJP");
    cout << "Napis str2 "<< str2 << endl;
    return 0;
}

输出是:

Napis str2 Witaj
Napis str2 Cp
Napis str2 PJC

虽然应该是:

Napis str2 Witaj
Napis str2 Cpp
Napis str2 PJC

【问题讨论】:

标签: c++ string algorithm pointers char


【解决方案1】:

bug在函数的这个语句中

while(*pom1 != *str1){

应该有

while( pom1 != str1){

考虑到字符串文字具有常量数组的类型。因此,例如变量 str1 必须声明为

const char *str1 = "ppC";

函数也应该声明为

void cp( char *str2, const char *str1 );

此外,知道在标头&lt;algorithm&gt; 中声明了标准算法std::reverse_copy 也会很有用:)

【讨论】:

  • @riv 你错了。 C++ 中的字符串字面量具有常量数组的类型。
  • char* a = "aa"; 编译得很好。
  • @riv 编译器是否编译此语句完全不重要。根据 C++ 标准,它不会影响字符串文字的类型。
  • @riv str1 必须有限定符 const 因为它是根据标准的类型。 .没有任何“向后兼容性”。
  • @TheMask:不,因为const char* a = "a";正确的方法。
【解决方案2】:

标准库中有reverse_copy

... 它的用法如下:

template <typename CharT, size_t Ndest>
void cp(CharT (&dest)[Ndest], CharT const *src){
    auto f = src, l = src + std::strlen(src);
    assert(std::distance(f,l) < Ndest);
    *(std::reverse_copy(f, l, dest)) = '\0';
}

那么,看看吧Live On Coliru

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cassert>

template <typename CharT, size_t Ndest>
void cp(CharT (&dest)[Ndest], CharT const *src){
    auto f = src, l = src + std::strlen(src);
    assert(std::distance(f,l) < Ndest);
    *(std::reverse_copy(f, l, dest)) = '\0';
}

#include <iostream>

int main()
{
    char str1[]   = "ppC";
    char str2[10] = "Witaj";

    std::cout << "Napis str2 "<< str2 << std::endl;
    cp(str2, str1);
    std::cout << "Napis str2 "<< str2 << std::endl;
    cp(str2,"CJP");
    std::cout << "Napis str2 "<< str2 << std::endl;
    return 0;
}

【讨论】:

    【解决方案3】:

    在这种情况下,只需使用标准库 std::reverse_copy()

    std::reverse_copy( input , input + strlen( input ) , output );
    

    【讨论】:

      【解决方案4】:

      复制粘贴解决方案

      int len(const char *p) {
          int c = 0;
          while (*p != '\0')
          {
              c++;
              p++;
          }
          return(c);
      }
      
      void cp(char *str2, const char *str1){
      if(!(len(str2)<len(str1))){
         const char *pom1 = str1;
      
          while(*pom1){
              pom1++;
          }
          char* pom2 = str2;
         while( pom1 != str1){
               pom1--;
              *pom2 = *pom1;
               pom2++;
          }
          *pom2 = '\0';
      }
      }
      

      【讨论】:

        猜你喜欢
        • 2014-01-13
        • 2017-12-11
        • 1970-01-01
        • 2019-06-10
        • 1970-01-01
        • 2011-04-05
        • 2018-04-17
        • 2021-12-30
        • 2016-03-11
        相关资源
        最近更新 更多