【问题标题】:Console Application Exits Automatically C++控制台应用程序自动退出 C++
【发布时间】:2013-08-05 16:10:36
【问题描述】:

我正在制作一个非常简单的程序,只是想作为初学者学习 c++。它旨在简单地计算短句中元音的数量和辅音的数量。我在做这件事时遇到了一个有趣的小困境。

首先是代码:

    #include <iostream>
    #include <time.h>
    #include <string>


    using namespace std;



    int main()
   {    int vowells = 0, consenants = 0;
char sentence[100];
char alphabet[] = {'a','e','i','o','u','b','c','d','f','g','h','j','k','l','m','n','p','q','r','s','t','v','w','x','y','z'};
cout << "Please type in a sentence (up to 100 characters max, lower case only): ";

cin >> sentence;
cin.ignore();

cout << "Your sentence was: " << sentence;

for (int i=0; i < sizeof(sentence); i++)
{
    if (sentence[i] == alphabet[0]||sentence[i] == alphabet[1]||sentence[i] == alphabet[2]||sentence[i] == alphabet[3]||sentence[i] == alphabet[4])
    {vowells++;}
    else if (sentence[i] == alphabet[5]||sentence[i] == alphabet[6]||sentence[i] == alphabet[7]||sentence[i] == alphabet[8]||sentence[i] == alphabet[9]||sentence[i] == alphabet[10]||sentence[i] == alphabet[11]||
        sentence[i] == alphabet[12]||sentence[i] == alphabet[13]||sentence[i] == alphabet[14]||sentence[i] == alphabet[15]||sentence[i] == alphabet[16]||sentence[i] == alphabet[17]||sentence[i] == alphabet[18]||
        sentence[19] == alphabet[20]||sentence[i] == alphabet[21]||sentence[i] == alphabet[22]||sentence[23] == alphabet[24]||sentence[i] == alphabet[25])
    {consenants++;}
}

cout << "\nThe number of vowells is: " << vowells;
cout << "\nThe number of consenants is: " << consenants;

cin.get();


    }

抱歉,它看起来真的很乱。基本上在 cin >> 句子之后;我把 cin.ignore() 函数放在输入句子后去掉按回车键的行。在函数的末尾, cin.get() 只是假设用作一个断点,以便程序在关闭之前需要另一个输入。如果我只输入 1 个没有空格的单词,程序会根据需要运行并在最后暂停。如果我用空格输入多个单词,它会立即运行并立即关闭,甚至没有给我时间看到它。我认为这是由于某种原因的空间......虽然我不确定他们为什么会以这种方式影响它。

所以基本上,是空间给我带来了问题吗?如果是这样,我该如何摆脱它们或至少让程序忽略它们?

谢谢!

EDIT*** 所以我被告知我可以使用 windows Sleep() 命令让它暂停,这很有效。现在的问题是,正如另一个人评论的那样,cin 函数只接受第一个单词,而不考虑句子的其余部分。所以我想我需要去掉空格或者以某种方式使用不同的输入函数来让它正常工作。有关如何执行此操作的任何建议?

【问题讨论】:

  • cin 读到空格。所以下一个 cin 读取空格后的下一个单词
  • 这是否意味着我应该使用 getline(cin,sentence)?是否仍将其存储在数组中,每个字符占用一个空间?
  • 你真的应该一次问一个问题,提供最少的代码来说明和重现问题。
  • 好的,我将把它放在一个新问题中,谢谢。

标签: c++ console-application


【解决方案1】:

据我所知,在 C++ 中“睡眠”没有标准的跨平台方式。如果您运行的是 Windows,则可以使用以下内容:

#include <windows.h>
int main(){
    //do stuff
    Sleep(1000); // this will "sleep" for 1s (1000ms)
}

如果您不使用 Windows,我敢肯定还有 Linux/etc 替代品可以做类似的事情。我以前看过你的方法,但如果它不起作用,这应该是一个不错的选择。例如,您可以使用threads。那可以工作。

【讨论】:

  • 好的,谢谢你 Ricky,按照你说的做让我的程序保持打开的时间足够长,可以看到它,这实际上提出了另一个问题,我将在编辑时添加到我的原始帖子中。跨度>
  • 我们在 40 多年前曾将人类送上月球,让 Windows IDE 让控制台窗口保持打开状态应该不难,直到想要关闭它,而不是当 it 出现时。打开控制台窗口并手动运行程序总比用这种令人眼花缭乱的东西污染代码要好。
  • @PaulGriffiths 虽然我完全同意你陈述的第一部分,但第二部分,不是那么多 - 在一个方面。两行代码并没有那么大的污染,但我确实明白你的意思。它当然应该比 std::this_thread::sleep_for(time); 更容易。暂停控制台窗口,这是肯定的。
【解决方案2】:

是的,空格给你带来了问题。 &gt;&gt; 在遇到空白字符时停止将字符提取到缓冲区中。因此,如果您有一个单词后跟一个空格,然后是另一个单词,则只有第一个单词被放置在缓冲区中,只需调用&gt;&gt;。您稍后对cin.get 的调用已经有一个字符可以从流中读取,因为它们并非全部由&gt;&gt; 调用获取。

getline 提供了一种提取空格以及其他字符的方法。

  //cin >> sentence;
  //cin.ignore();
  cin.getline(sentence, 100)

【讨论】:

  • 太好了,在我尝试之前,我的 getline() 语法错误。谢谢你,效果很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-17
  • 2014-09-04
  • 1970-01-01
  • 1970-01-01
  • 2010-11-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多