我有一项任务是创建一个简单的字符串阅读器,要求用户输入一个句子,并修复以下内容:
首先,使用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);
}
答案 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;
}