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

using a string array in a function C++

本文关键字:字符串 数组 c++ 函数      更新时间:2023-10-16

这个问题应该是简单直接的,但是在网上搜索后,我找不到答案。可能是因为这个问题太简单了。
下面的代码来自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]应该做一些事情,以使其成为一个字符数组。我想不明白。
是关于指针的吗?对不起,我还没有学过指针。

你明白我的问题了吗?任何帮助都非常感谢!!

如果你想让字符串中的字母小写,那么使用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++的习惯,也更不容易出错。

您正在尝试将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]);一样使用它作为常规字符串,它会复制A中的第i个字符串。

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

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

此外,使用数组名称B和索引j是滑稽的。