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;不是结构或联合
调用函数时,是否可以传入字符串作为参数,因为字符串是字符的向量?
答案 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;
}