在C ++中复制和反转char *

时间:2014-03-22 16:24:34

标签: c++ string algorithm pointers char

我想将反向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

4 个答案:

答案 0 :(得分:4)

该错误发生在函数

的声明中
while(*pom1 != *str1){

必须有

while( pom1 != str1){

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

const char *str1 = "ppC";

此功能也应声明为

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

此外,了解标题std::reverse_copy中声明的标准算法<algorithm>会很有用:)

答案 1 :(得分:2)

  

stdlib中有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;
}

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

复制粘贴解决方案

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