在 while 和向量中输入

Posted

技术标签:

【中文标题】在 while 和向量中输入【英文标题】:Input inside while and vectors 【发布时间】:2017-05-18 20:01:53 【问题描述】:

这是 vectors 的新手方法。以下程序非常简单,但我不明白我做错了什么。它很小,所以我相信阅读它不会有麻烦。它应该创建一个向量并向其添加字符串。然后在屏幕上打印字符串。如果字符串已被打印,它会跳过它并转到下一个。此外,如果字符串是不喜欢的单词之一(在这种情况下只有单词“left”),那么它也会跳过它。

#include <iostream>
#include <string>
#include <vector>

using namespace std;
int main()

    vector<string>words;
    string temp,disliked;
    disliked = "left";
    while(cin>>temp)
    
    words.push_back(temp);
    
    for(int i=0; i<words.size(); i++)
    
        if(( i==0 || words[i] != disliked && words[i-1]!=words[i]))
        
        cout << words[i] << endl;
        
    

return 0;

这个程序来自 Stroustrup 的书“Programming, principle and practice using c++”。我使用了我在书中找到的代码,但是当我运行代码时,while 循环似乎永远不会结束。 cin>>temp 可能有什么问题; ? 编辑: 当我运行程序时,while 循环似乎永远不会停止。我尝试“失败”将字符串作为输入,这样 cin>>temp; 也会失败。 但无论我作为输入输入的数据类型如何,cin 似乎都不会失败。在 stroustrup 的书中,代码完全一样,这很奇怪,因为我遇到了我无法查明的逻辑错误。 当我输入字符串以外的内容时,该程序应该停止。然后 while 循环条件将失败,循环将结束并且 for 循环将开始,给我留下一个不错的向量和一些字符串。 感谢您的宝贵时间。

【问题讨论】:

欢迎来到 Stack Overflow。请花时间阅读The Tour 并参考Help Center 中的材料,您可以在这里问什么以及如何问。 while(std::cin &gt;&gt; temp) 将循环直到std::cin 没有失败。所以你显然没有触发std::cin的失败条件,这可能是文件结束失败、其他一些读取失败或一些意外的流字符 "cin>>temp; 有什么问题?" 它到底出了什么问题?请提供一个minimal reproducible example 来重现您的问题。 您似乎缺少正确的范围界定。使用 块将所有应在while() 循环中执行的语句。 调试器是解决此类问题的正确工具。 询问 Stack Overflow 之前,您应该逐行浏览您的代码。如需更多帮助,请阅读How to debug small programs (by Eric Lippert)。至少,您应该在edit 您的问题中包含一个重现您的问题的Minimal, Complete, and Verifiable 示例,以及您在调试器中所做的观察。 【参考方案1】:

使用

if((words[i] != disliked && words[i-1]!=words[i]) || i==0)

是一个问题,因为i == 0|| 的第二个子句。 words[-1] 将在您检查之前被访问,这会导致未定义的行为。

改成:

if( (words[i] != disliked) && (i == 0 || words[i-1] != words[i]))

为了使您的代码更具可读性,请使用 使块的范围更清晰。

int main()

   vector<string>words;
   string temp,disliked;
   disliked = "left";

   cout << "bam" << endl;
   while(cin>>temp)
   
      words.push_back(temp);
   
   cout << "bam" << endl;

   for(int i=0; i<words.size(); i++)
   
      if ( (words[i] != disliked) && (i == 0 || words[i-1] != words[i]) )
      
         cout << words[i] << endl;
      
   

   return 0;

【讨论】:

以上是关于在 while 和向量中输入的主要内容,如果未能解决你的问题,请参考以下文章

如何使用重复、while 循环或其他迭代技术编写一个根据某些规则返回输入向量索引的函数

练笔--字符串,向量和数组1

练笔-字符串,向量和数组3

在向量c ++中对复数进行排序

将字符串转换为双精度,然后将其推送到 While 循环中的向量

用于创建重复元素向量的 for/while/if 程序