2013-06-11 44 views
1

这个问题应该是简单而直接的,但是在网上搜索后,我找不到答案。可能是因为这个问题太简单了。
以下代码是从cplusplus.com。这是一个使字符串小写的函数。我打算做类似的事情。在函数中使用字符串数组C++

/* 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];部分是不对的,错误消息是:
错误:初始化期望聚合对象的'{...}'。

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

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

+0

你能包括B [j]的声明吗? – keelar

+0

@keelar对你来说足够了吗?我知道这不太好。谢谢你的帮助! – Honeycrisp

+0

您在示例中使用了字符串对象,并且来自cpluspuls的原始代码使用了字符数组。你想和谁一起工作? – ryanbwork

回答

1

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

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

这是更为自然和C++比char *直接和更不容易出错工作惯用。

+0

谢谢!!!这个作品很棒! – Honeycrisp

+0

请记住,您可以接受和/或向上提供您认为有帮助的答案。 – greatwolf

+0

哈哈感谢提醒! – Honeycrisp

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

+0

在看到B []的定义之后,虽然upvote仍然存在,但您的答案不正确。 – ryanbwork

+0

我明白了。我会编辑我的答案。 –

1

你在这里混淆了字符数组和字符串对象。字符数组是一个由null结尾的设置大小的字节数组,而字符串是一个根据需要展开/收缩的对象,并且不需要空终止符。您正试图将字符串对象分配给不受支持的字符数组。如果你正在使用String对象,并希望检索其相应的字符数组,利用c_str()函数:

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

另外,在使用的B数组名和j指数是热闹。

+0

非常感谢你的解释!这确实有很大帮助!我不知道为什么会发生这种情况,当我改变它时, VS在本声明中标记为_B_并显示:_Error:类型“const char *”的值不能用于初始化“char *”类型的实体_非常感谢您的帮助先生! – Honeycrisp

+0

是不是说ijk是人们用的?只是想知道 – Honeycrisp

+0

对不起。 c_str()返回一个指向数组的指针,并且该数组不能被修改。您需要将c_str()的输出转换为char *(IE'(char *)B [j] .c_str()')或使用const char *。 – ryanbwork