我已按照此处的代码示例进行操作
并在我自己的代码中实现如下
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 ,这是问题吗?如果是这样,这个例子是如何工作的?
还有,
char* str[strlen(m_pString)];
int i=0;
str[strlen(m_pString)]=m_pString;
不是有效的 C++ - 数组必须使用编译时常量来确定尺寸 - 这是 C99 功能。我真的不认为代码会做你想要的事情,即使它是合法的,因为你似乎正在访问数组末尾的一个。如果您发布完整的类定义将会很方便。
我不认为你的代码做了你想要它做的事情,事实上,如果它编译它就会爆炸。
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;
还有更多问题,但这应该会让你更加朝着正确的方向前进。
您需要向 toupper() 提供一个 int (或一个 char)而不是 char *,这就是您声明 c 的方式。
尝试:
char c;
还有,
char* str[strlen(m_pString)];
是一个指向字符的指针数组,而不仅仅是单个字符串。
这一行:
str[strlen(m_pString)]=m_pString;
是对坏指针的赋值,因为没有分配。
我将假设 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);
}
没有从
char *
到 int
的内置转换,这就是发生错误的原因。 由于您尝试将字符大写,因此需要取消引用指针。
putchar(toupper(*c));