2016-10-27 33 views
-2

我有一個分配創建要求用戶輸入一個句子一個簡單的字符串閱讀器,並固定如下:C++字符串作爲函數數組,不斷收到錯誤訊息

  • 首先,使用功能原型int splitSent(string sentence, string words[], int maxWords);函數返回句子中單詞的數量,'maxWords'

  • 如果用戶的輸入以小寫字母開頭,則將其加以限制。

  • 如果用戶輸入包含字符串,「計算機科學」,切換字符串「CS」

對於第一個任務,我被迫不使用動態數組,向量和任何'char'變量。另外,我必須保留給定的原型。

我完全可以在主函數中使用一個for循環來計算出有多少單詞,但是由於我從未在函數調用中使用過字符串作爲數組,不使用任何字符變量,矢量等。

在我寫的代碼中,在主函數中,我必須在函數調用之前計算主函數中的所有值才能使其工作嗎?現在,它提供了一個錯誤信息,說

In function 'int main()': 
[Error] expected primary-expression before ']' token 
At global scope: 
[Error] declaration of 'words' as array of references 
[Error] expected ')' before ',' token 
[Error] expected unqualified-id before 'int' 

我被困在這裏多小時,沒有什麼更多的,我可以從谷歌上搜索了獲得。請指教。

#include <iostream> 
#include <string> 
using namespace std; 

int splitSent(string sentence, string words[], int maxWords); 

int main() 
{ 
    string sentence, words; 
    int maxWords; 
    cout << "Enter a sentence. (Maximum words allowed - 100)" << endl; 
    getline(cin, sentence); 
    splitSent(sentence, words[], maxWords); 
    return 0; 
} 

int splitSent(string sentence, string& words[], int& maxWords) 
{ 
    int temp = 0, count = 1; 
    for (int j = 0; j < sentence.length(); j++) 
     if (sentence[i] == ' ') 
      count++; 

    words[count]; 
    maxWords == count; 

    for (int i = 0; i < sentence.length(); i++) { 
     if (sentence[i] == ' ') 
      temp++; 
     else if (sentence[i] != ' ') 
      words[temp] += sentence[i]; 
    } 

    return (count); 
} 
+2

谷歌並不是教學書的替代品。使用代碼**這個**錯誤,您迫切需要[The Definitive C++ Book Guide and List](http://stackoverflow.com/q/388242/1889329)中的幾本書。 – IInspectable

+0

任何實際幫助...? – Minjae

+0

編譯器錯誤消息沒有幫助嗎? – IInspectable

回答

0

有一些語法錯誤和一些邏輯問題。

我注意到你試圖通過words[]進入函數。 何時使用words以及何時使用words[]可能會引起混淆。 當您聲明它時,請使用string words[],例如在函數定義的參數列表中。 這是告訴函數什麼期望。 當你通過它時,使用words,因爲你傳遞了整個東西。 函數內部使用words[index],因爲您指的是數組中的特定元素。

您必須聲明words作爲string的數組,而不是string

你只是直接傳遞字符串數組,而不是通過引用。 當你直接傳遞它時,你沒有傳遞數組的副本,編譯器確保函數具有數組中第一個元素的地址,所以沒有性能損失,並且你正在處理原始數組 - 這是是你想要的。

上面的函數聲明與下面的函數定義不同。 它們應該是相同的 - 聲明是您應該使用的版本。

int splitSent(string sentence, string words[],int maxWords); 

您可以通過引用想maxWords,但是這不應該的功能,因爲它持有的數組的大小進行修改。 它阻止你跑過數組的末尾。

功能splitSent忽略多個空格。它讀取maxWords但不更新它。 它返回它找到的單詞的實際數量。 這可能大於maxWords,但words陣列只能寫入長度爲maxWords

// returns number of words in sentence 
// updates words[], using `maxWords` to prevent writing past end of array 

int splitSent(string sentence, string words[], int maxWords) 
{ 
    int word_index = 0; 
    int letter_count = 0; 

    //words[count]; // not sure what was intended by this statement 

    for (int i = 0; i<sentence.length(); i++) { 
     if (sentence[i] == ' ') { 
      // handles multiple spaces in a row 
      if (letter_count > 0) { 
       word_index++; 
       letter_count = 0; 
      } 
     } 
     else if (word_index < maxWords) {  // check the word_index is within bounds of array 
      words[word_index] += sentence[i]; 
      letter_count++; 
     } 
    } 
    if (letter_count > 0) 
     return (word_index + 1); 
    return (word_index); 
} 

int main() { 
    string sentence; 
    int const maxWords = 100; // constant integer, so compiler lets us use it to declare the size of the array 
    string words[maxWords];  // function expects an array of strings, so have to declare one 
    cout << "Enter a sentence. (Maximum words allowed - " << maxWords << ")" << endl; 
    getline(cin, sentence); 
    int wordCount = splitSent(sentence, words, maxWords); 
    return 0; 
} 
+0

我一直在函數調用中與數組的語法混淆。非常感謝! 我只是無法抗拒在函數原型中使用[]。 – Minjae

+0

您能否更詳細地解釋爲什麼您將maxWords聲明爲const變量?即使在函數調用之後,它也不會被改變,並且沒有const就可以正常工作。 – Minjae

+0

有2個原因。首先,你只能聲明一個具有常量大小的數組,所以'string words [maxWords];'只有當'maxWords'被聲明爲'const'時才被允許。其次,當你認爲某些東西是不變的時候,讓編譯器檢查你不會錯誤地改變它是很好的。通過聲明它爲'const',如果編譯器發現你在任何地方寫信給它,編譯器會顯示一個錯誤。在這裏檢查並不困難,但是在更大的程序中,手動查找修改您所依賴的變量是常量所導致的錯誤可能非常困難。 –

相關問題