我已按照此处的代码示例
并在我自己的代码中实现,如下所示
void CharString::MakeUpper()
{
char* str[strlen(m_pString)];
int i=0;
str[strlen(m_pString)]=m_pString;
char* c;
while (str[i])
{
c=str[i];
putchar (toupper(c));
i++;
}
}
但这给了我以下编译器错误
CharString.cpp: In member function 'void CharString::MakeUpper()':
CharString.cpp:276: error: invalid conversion from 'char*' to 'int'
CharString.cpp:276: error: initializing argument 1of 'int toupper(int)'
CharString.cpp: In member function 'void CharString::MakeLower()':
这是第276行
putchar (toupper(c));
据我所知,toupper正在寻找int作为参数并返回一个int也就是问题了吗?如果是这样,该示例如何工作?
答案 0 :(得分:4)
此外,
char* str[strlen(m_pString)];
int i=0;
str[strlen(m_pString)]=m_pString;
无效C ++ - 必须使用编译时常量标注数组 - 这是C99功能。我真的不认为代码会做你想要的,即使它是合法的,因为你似乎是在数组的末尾访问一个。如果您发布了完整的类定义,那将会很方便。
答案 1 :(得分:3)
我认为你的代码不符合你的要求,事实上如果它编译它会爆炸。
char* str[strlen(m_pString)]; // you've made an array of X C strings where
// X is the length of your original string.
int i=0;
str[strlen(m_pString)]=m_pString; // You've attempted to assign the C string in your array
// at location X to point at you m_pString. X is the
// same X as before and so is 1 past the end of the array
// This is a buffer overrun.
我认为你真正想做的是将m_pString的内容复制到str中。你这样做是这样的:
char * str = new char[strlen(m_pString)];
memcpy(str, m_pString); // I may have the operands reversed, see the docs.
更简单的方法是停止使用C字符串并使用C ++字符串:
std::string str = m_pString;
还有更多问题,但这可以让你引导你朝着正确的方向前进。
答案 2 :(得分:2)
你需要为toupper()提供一个int(或char)而不是char *,这就是你声明c的方式。
尝试:
char c;
此外,
char* str[strlen(m_pString)];
是一个指向字符的指针数组,而不仅仅是一个字符串。
这一行:
str[strlen(m_pString)]=m_pString;
是对坏指针的赋值,因为没有分配。
答案 3 :(得分:1)
没有从char *
到int
的内置转换,这就是错误发生的原因。由于您正在尝试将字符大写,因此需要取消引用指针。
putchar(toupper(*c));
答案 4 :(得分:1)
我将假设m_pString是C样式字符串(char *)。你正在做的事情比你需要做的更多。
void CharString::MakeUpper()
{
char* str = m_pString; // Since you're not modifying the string, there's no need to make a local copy, just get a pointer to the existing string.
while (*str) // You can use the string pointer as an iterator over the individual chars
{
putchar (toupper(*str)); // Dereference the pointer to get each char.
str++; // Move to the next char (you can merge this into the previous line if so desired, but there's no need.
}
}
在你引用的例子中,它起作用的原因是因为变量的声明方式。
int main ()
{
int i=0;
char str[]="Test String.\n"; // This is a compile time string literal, so it's ok to initialize the array with it. Also, it's an array of `char`s not `char*`s.
char c; // Note that this is also a `char`, not a `char *`
while (str[i])
{
c=str[i];
putchar (toupper(c));
i++;
}
return 0;
}
由于使用C字符串的容易出错的方式,最好的选择是std :: string:
void CharString::MakeUpper()
{
string str(m_pString);
transform(str.begin(), str.end(), ostream_iterator<char>(cout), &toupper);
}