2013-06-11 39 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