初学者C ++问题

时间:2010-04-22 16:13:09

标签: c++ string compiler-construction char

我已按照此处的代码示例

  

toupper c++ example

并在我自己的代码中实现,如下所示

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也就是问题了吗?如果是这样,该示例如何工作?

5 个答案:

答案 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);
}