处理字符串中的字符

问题描述 投票:0回答:5

我已按照此处的代码示例进行操作

上层 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 ,这是问题吗?如果是这样,这个例子是如何工作的?

c++ string char
5个回答
4
投票

还有,

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

不是有效的 C++ - 数组必须使用编译时常量来确定尺寸 - 这是 C99 功能。我真的不认为代码会做你想要的事情,即使它是合法的,因为你似乎正在访问数组末尾的一个。如果您发布完整的类定义将会很方便。


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
投票

您需要向 toupper() 提供一个 int (或一个 char)而不是 char *,这就是您声明 c 的方式。

尝试:

char c;

还有,

char* str[strlen(m_pString)];

是一个指向字符的指针数组,而不仅仅是单个字符串。

这一行:

str[strlen(m_pString)]=m_pString;

是对坏指针的赋值,因为没有分配。


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

1
投票

没有从

char *
int
的内置转换,这就是发生错误的原因。 由于您尝试将字符大写,因此需要取消引用指针。

putchar(toupper(*c));

© www.soinside.com 2019 - 2024. All rights reserved.