在函数C ++中使用字符串数组

时间:2013-06-11 22:09:12

标签: c++ arrays string visual-studio-2010

这个问题应该简单直接,但在网上搜索后,我找不到答案。可能因为这个问题太简单了 以下代码来自cplusplus.com。它是使字符串小写的功能。我打算做类似的事情。

/* tolower example */
#include <stdio.h>
#include <ctype.h>
int main ()
{
  int i=0;
  char str[]="Test String.\n";
  char c;
  while (str[i])
  {
    c=str[i];
    putchar (tolower(c));
    i++;
  }
  return 0;
}

我所做的是:

void search(string A[], string B[], int k)
{                               
    int temp;
    for(int j = 0; j <= 4; j++)
    {
        for(int i = 0; i <= k; i++)
        {
            string str (A[i]);
            int h = 0;
            char lstr[] = B[j];
            char c;
            while (lstr[h])
            {
                c = lstr[h];
                putchar (tolower(c));
                h++;
            }
            string key (B[j]);
.....

这部分代码在for循环中。 B [j]是一个字符串数组。
Visual Studio通知我 char lstr [] = B [j]; 部分不对,错误信息是:
错误:聚合对象需要'{...}'初始化。

我认为问题是我没有在函数中使用正确的字符串数组语法。应该为B [j]做一些事情,以使它成为一个char数组。我无法弄明白。
是关于指针的东西?对不起,我还没学过指针。

我的问题对你有意义吗?非常感谢任何帮助!!

3 个答案:

答案 0 :(得分:1)

您正在尝试将char分配给char[]。您可以使用以下代码获得所需的效果:

....
int h = 0;
char* lstr = &B[j]; // point lstr to the address of j'th element of B.
char c;
while (lstr[h])
{
    c = lstr[h];
    putchar (tolower(c));
    h++;
}
.....

这样做是lstr现在是指向B中第j个字符的指针。数组本质上是指针。执行B[j]时,它等同于编写char ch = *(B + j);,其中B指向字符数组中第一个字符的地址(也称为字符串)。

修改 在您进行修改后,您现在似乎正在尝试将std::string分配给char。这是纠正后的解决方案。

....
int h = 0;
string& lstr = B[j]; // grab a reference to the j'th string in B.
char c;
while (lstr[h])
{
    c = lstr[h];
    putchar (tolower(c));
    h++;
}
.....

这里,lstr本质上是对B中第j个字符串的引用,你可以将它用作常规字符串,就像你使用string str(A[i]);一样,它会复制第i个字符串在A

答案 1 :(得分:1)

这里混淆了字符数组和字符串对象。字符数组是设置大小的字节数组,它以空值终止,而字符串是一个对象,它根据需要扩展/收缩,不需要空终止符。您正在尝试将字符串对象分配给不受支持的字符数组。如果您正在处理字符串对象,并想要检索它们的等效字符数组,请使用c_str()函数:

const char* lstr = B[j].c_str()

此外,使用数组名B和索引j非常有趣。

答案 2 :(得分:1)

如果您希望将字符串中的字母设为小写,那么只需使用字符串就可以使用std::transform。例如,

// make sure to #include <algorithm>
// at the top
string lstr = B[j];
std::transform(lstr.begin(), lstr.end(), lstr.begin(), ::tolower);

与直接使用char *并且不易出错相比,这更加自然,而且是c ++惯用语。