Вопрос для начинающих C ++ - PullRequest
1 голос
/ 22 апреля 2010

Я следовал примеру кода здесь

пример toupper c ++

И реализовал это в моем собственном коде следующим образом

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 ]

4 голосов
/ 22 апреля 2010

Кроме того,

char* str[strlen(m_pString)];
int i=0;
str[strlen(m_pString)]=m_pString;

не является допустимым C ++ - массивы должны быть измерены с использованием констант времени компиляции - это функция C99.И я действительно не думаю, что код будет делать то, что вы хотите, даже если бы он был законным, так как вы, кажется, получаете доступ к одному за концом массива.Было бы удобно, если бы вы опубликовали полное определение класса.

3 голосов
/ 22 апреля 2010

Я не думаю, что ваш код делает то, что вы хотите, и на самом деле, если он скомпилирован, он взорвется.



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 голосов
/ 22 апреля 2010

Вам нужно указать toupper () int (или char) вместо char *, как вы объявили c.

попробовать:

char c;

Кроме того,

char* str[strlen(m_pString)];

- это массив указателей на символы, а не просто одна строка.

Эта строка:

str[strlen(m_pString)]=m_pString;

- это присвоение неверного указателя, поскольку распределение не было.

1 голос
/ 22 апреля 2010

Я собираюсь пойти с предположением, что 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.
   }
}

В приведенном вами примере причина работает из-за того, как переменные объявляются.* Из-за подверженных ошибкам способов использования C-строк лучшим выбором будет std :: string:

void CharString::MakeUpper()
{
   string str(m_pString);
   transform(str.begin(), str.end(), ostream_iterator<char>(cout), &toupper);
}
1 голос
/ 22 апреля 2010

Нет встроенного преобразования из char * в int, поэтому возникает ошибка. Поскольку вы пытаетесь использовать заглавные буквы, вам нужно разыменовать указатель.

putchar(toupper(*c));

...