我正在尝试从控制台获取用户输入,而不使用c ++标准库类。这是我的代码
while(true){
std::string line = " ";
while (getline(std::cin, line)) {
std::string arr[100];
int i = 0, len = 0;
for (int j=0; j < line.length(); j++) {
if(line[j] ==' ' || line[j] == '\n'){
std::string word = line.substr(i, j);
arr[len] = word;
len++;
i = j;
}
}
for (int k = 0; k <len ; ++k) {
std::cout<<arr[k]<<std::endl;
}
}
//break;
}
这个想法是识别每个单词并将其存储在一个数组中。但是,该程序仅识别第一个单词。任何想法,我在这里做错了什么。
答案 0 :(得分:1)
在阅读本文时,您的问题似乎就在std::string word = line.substr(i, j);
行。你必须明白substr
的论点不是“从i到j”,而是“从i,j字符”。 Read the documentation.:)
我没有测试过这个,所以它可能不完美,但原则就在那里。
while(true){
std::string line = " ";
while (getline(std::cin, line)) {
std::string arr[100];
int num_chars = 0, word = 0;
for (int i=0; i < line.length(); i++) {
/*We increment i, so every non-space character is one we
* will include in the word.*/
num_chars++;
if(line[i] ==' ' || line[i] == '\n'){
/*We want all characters from i to i+num_chars, that is
* we want all characters from j, forward i indices.
*/
std::string word = line.substr(i, num_chars);
arr[word] = word;
word++;
//We reset i here, in prep for parsing the next word.
i = 0;
}
}
for (int k = 0; k <len ; ++k) {
std::cout<<arr[k]<<std::endl;
}
}
//break;
}
另外两个考虑因素:
1)注意单字母变量,因为它使得以后阅读代码变得更加困难。 i
是循环 i terator或 i ndex的标准,当您为循环嵌套时j
是下一个 < / em>的。但是,i
不适合“单词的长度”。同样,len
不适合存储的单词的索引。我更改了代码中的变量,使其更易于阅读。
2)我会认真考虑重新审视你的循环结构。 while
是常见且非常有用的,但它也非常容易出现无限循环。事实上,while(true)
是一个无限循环,所以如果你因为某种原因没有达到break
,你就会遇到一些严重的问题。
-
我也同意,如果你想避免“STL”(实际上std::
和stl
通常会混淆,但不是一回事...所以让我们说你想要要避免std
),您需要避免std::string
和std::cin
。正如Nidhoegger建议的那样,使用C字符串和scanf
/ printf
代替。它比std
选项更有效,但它更容易出现C的错误和“未定义行为”特征。这需要更多的努力,但如果你做得对,会产生更有效的结果。 / p>
虽然我们正在使用它,但我不建议使用std::stringstream
,除非您的其他工具无法正常工作。该课程存在严重的性能和效率问题,这些问题已得到充分证明。我只建议在使用std::string
编写自己的代码的情况下使用它,这样做太费力或者很有可能效率低下。这不是其中之一。