C ++ String作为函数中的数组,不断收到错误消息

时间:2016-10-27 00:36:50

标签: c++ arrays string function

我有一项任务是创建一个简单的字符串阅读器,要求用户输入一个句子,并修复以下内容:

  • 首先,使用int splitSent(string sentence, string words[], int maxWords);的函数原型,其中函数返回句子中的单词数,并且'maxWords'

  • 如果用户的输入以小写字母开头,则可以使用它。

  • 如果用户输入包含字符串'Computer Science',请将字符串切换为'CS'

对于第一项任务,我被迫不使用动态数组,向量和任何'char'变量。另外,我必须保留给定的原型。

我绝对可以在main函数中使用单个for循环来计算出有多少单词,但是由于我从未在函数调用中使用过字符串作为数组,因此给定的任务让我发疯了使用任何char变量,矢量等等。

在我写的下面的代码中,在main函数中,我必须在函数调用之前计算main函数中的所有值才能使它工作吗?目前,它会显示错误消息

 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'

我被困在这里好几个小时了,我再也无法从Google上搜索了。请指教。

#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);
}

1 个答案:

答案 0 :(得分: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;
}