这个问题应该简单直接,但在网上搜索后,我找不到答案。可能因为这个问题太简单了 以下代码来自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数组。我无法弄明白。
是关于指针的东西?对不起,我还没学过指针。
我的问题对你有意义吗?非常感谢任何帮助!!
答案 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 ++惯用语。