用c ++

时间:2018-02-26 16:06:36

标签: c++ pointers

void pal_string_copy(char * source, char * destination){

for(int i = 0; i < *source.length(); i++)
{
    if(isalpha(*source[i]))
    {

        destination += toupper(*source[i]) ;

    }


}

我们必须使用带有这些参数的函数来制作字符串的副本,同时剥离空格并只取字母,然后使它们成为uppcase以检查它是否是回文(在不同的函数中完成。我得到错误

  

会员参考基础类型&#39; char *&#39;不是结构或联合

调用函数时,是否可以传入字符串作为参数,因为字符串是字符的向量?

2 个答案:

答案 0 :(得分:0)

看起来你混合了两个概念--C字符串为char *,C ++字符串为std::string,你尝试使用char *,就像std::string(length()方法一样+ = etc),所以你在C ++中的代码应该是这样的:

std::string pal_string_copy( const std::string &str )
{
    std::string destination;
    for(char c : str ) {
        if(isalpha(c))
            destination += toupper(c);
    }
    return destination;
}

或者如果您必须使用C样式字符串,那么您不能使用方法,但C函数strlen()等。

答案 1 :(得分:0)

您正在尝试将char *视为std::string类型对象。要使用char *,您应该查找从C继承的函数来处理字符串(例如,std::strlen以获取字符串的长度)。

此外,您对指针的操作方式也不正确。写这个的更好方法是尝试使用迭代器和STL来最小化这样的错误:

#include <string>
#include <algorithm>
#include <cstdlib>
#include <iostream>
#include <iterator>

int main() {
   std::string orig = "test123", dest;

   std::cout << "Original: " << orig << std::endl;

   //Copies the string orig into dest but by only keeping the letters
   std::copy_if(orig.begin(),orig.end(),std::back_inserter(dest),[](char ch) { return std::isalpha(ch); });
   //Transforms each character in dest to upper case
   std::for_each(dest.begin(),dest.end(),[](char &ch) { ch = std::toupper(ch); });

   std::cout << "Transformed: " << dest << std::endl;

   return 0;
}

修改

这是一个迭代字符串但避免使用指针的版本:

#include <string>
#include <algorithm>
#include <cstdlib>
#include <iostream>
#include <iterator>

int main() {
   std::string orig = "test123", dest;

   std::cout << "Original: " << orig << std::endl;

   for( auto ch : orig ) {
       if(std::isalpha(ch)) dest += std::toupper(ch);
   }

   std::cout << "Transformed: " << dest << std::endl;

   return 0;
}