1

这个问题应该很简单直接,但是在网上搜索后,我找不到答案。可能是因为问题太简单了。
以下代码来自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 数组。我想不通。
那是关于指针的东西吗?对不起,我还没有学习指针。

我的问题对你有意义吗?任何帮助是极大的赞赏!!

4

3 回答 3

1

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

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

此外,使用数组名称B和索引j也很有趣。

于 2013-06-11T22:25:02.970 回答
1

您正在尝试将 a 分配charchar[]. 你可以通过以下代码得到你想要的效果:

....
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是现在是一个指向 .j 中第 j 个字符的指针B。数组本质上是指针。当你这样做时B[j],它相当于写char ch = *(B + j);,其中 B 指向字符数组(也称为字符串)中第一个字符的地址。

编辑编辑 后,现在您似乎正在尝试将 a 分配std::string给 a 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

于 2013-06-11T22:12:40.177 回答
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++ 习惯,而且更不容易出错。

于 2013-06-11T22:32:09.800 回答