getchar()不能正常工作?

时间:2011-12-09 08:02:12

标签: c++ getchar

我用C ++编写了这段代码,并使用getchar()来暂停控制台,但我没有看到使用该函数的任何影响,这里是代码:

#include<iostream>
#include<stdio.h>//to pause console screen

using namespace std;
//function prototypes
int  getSmallest(int*);
int getOccurrence(int, int*);

int main(){

    int a[7], counter=0, smallest;
    cout<<"Please enter 7 integers"<<endl;
    while(counter!=7){
        cin>>a[counter];
        counter++;
    }
    smallest=getSmallest(a);
    cout<<"The smallest number is "<<smallest<<"; it apears "<<getOccurrence(smallest,a)<<" times"<<endl;
    getchar();//to pause console screen
    return 0;
}

int  getSmallest(int*x){
int count=0, smallest=*x;
//loop till last item in array
while(count!=7){

    if(*x<smallest)
        smallest=*x;
    count++;
    x++;
}
return smallest;
}


int getOccurrence(int smallest, int* address){

int count=0,occ=0;
//loop till last item in array
while(count!=7){

    if(*address==smallest)
    occ++;
    count++;
    address++;
}
return occ;

}

5 个答案:

答案 0 :(得分:6)

正如已经指出的那样,问题是您的输入缓冲区有一个字符串表示数字和换行符。 C ++ I / O在读取类似数字的内容时跳过前导空格,但它不会将尾随空格从缓冲区中取出。它留下了 next 读取来处理。因此,getchar()正在获取尚未处理的换行符。

忽略那些试图告诉你flush(),ignore()或清除“getchar()调用前缓冲区中的内容”的人的建议。这些函数没有“非阻塞”输入的概念。

换句话说:通常的C ++输入流函数没有“现在什么都没有”的概念......但是之后你打电话给它,它说“哦,但现在有一些东西!!!“有一个”输入序列“,你只能在你点击EOF时检测到停止。

对此的例外是readsome() ...而不是在“输入序列”上操作对“输入缓冲区”进行操作。找到这样的东西,我们可以试试这个:

#include<iostream>
#include<cstdio>//to pause console screen

using namespace std;

int main(int argc, char* argv[]) {
    cout << "Enter a number\n";
    int num;
    cin >> num;

    char ch;
    while (cin.readsome(&ch, 1) != 0)
         ;

    cout << "Press any key to continue...\n";
    getchar();
    return 0;
}

但至少在我的机器上,它不会产生预期的效果。这意味着即使在某个地方的终端应用程序或操作系统管道中有换行符,它还没有达到cin的内部流缓冲区对象。 Upshot是:有一个基于缓冲区的非阻塞输入函数,但在这种情况下它显然没有帮助。

真正的答案就是Alf在评论中所说的。大多数体面的开发环境或设置都有一些方法可以将其配置为不让控制台自动关闭。如果没有,请使用您的启动方法破解它。哎呀,你甚至可以在主要的return 0上放一个断点!


备注:

您应该知道C的兼容性库的“正确”C ++包含是以#include <cfoo>而不是#include "foo.h"完成的。它可能不会在实践中产生太大的影响......但是当人们评论它时,至少会分散你的问题(就像我现在正在做的那样):

Is it bad practice to use a C header instead of its C++ equivalent in C++ (e.g. stdio.h instead of cstdio)?

另外,你可以用更小的样本证明这一点!您可以使用以下方式显示效果:

#include<iostream>
#include<cstdio>//to pause console screen

using namespace std;

int main(int argc, char* argv[]) {
    cout << "Enter a number\n";

    int num;
    cin >> num;

    cout << "Press any key to continue...\n";
    getchar();
    return 0;
}

因此,请尝试减少您的示例,以便在将来真正隔离问题! (请随意编辑您的问题,以便使这个帖子对搜索人员更有用。)

答案 1 :(得分:0)

这可能是缓冲区的问题。由于缓冲区,getChar从缓冲区获取输入,因此在调用getChar()之前最好到flush buffer

答案 2 :(得分:0)

试试这个:

int main()
{
   // ...
   std::cin.get();
   std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

   return 0;
}

答案 3 :(得分:0)

以下是两个替补:

  1. getch();您必须使用#include <conio.h>
  2. 系统( “暂停”);

答案 4 :(得分:0)

这就是为什么他们将isspace和ispunct函数放在你自己的函数原型中并且指向值b / c cin&gt;&gt;和&#34;而((ch = getchar())!=&#39; \ n&#39;)&#34;最让人失望的是使用指针和大小t,它是Cstrings函数的返回类型&#34; strlen()&#34;

void remove_whitespace(char *str)
{
    char *p;
    size_t len = strlen(str);

      for(p = str; *p; p ++, len --) {

       while(isspace(*p)) memmove(p, p+1, len--);
}

用于c编程示例...这里

char string[100], ch;
int i = 0;
cout<<"Enter a message: ";

while((ch = getchar()) != '\n') //grab users input string untill 
{                               //Enter is pressed
    if (!isspace(ch) && !ispunct(ch)) //Cstring functions checking for
    {                               
        string[i] = tolower(ch); 
        i++;
    }
}

如果你只想编写c ++代码,你必须从头开始创建自己的函数......或者尝试使用其中包含* s的可怕函数

char name[100];
//string userInput[26];
int i=0, n=0;
cout<<"your name? ";
cin>>name;
cout<<"Hello "<<name<< endl;

char *ptr=name;
for (i = 0; i < 20; i++)
{
cout<<i<<" "<<ptr[i]<<" "<<(int)ptr[i]<<endl;
}   
int length = 0;
while(name[length] != '\0')
{
    length++;
}
cout<<name <<"is"<<length<<"chars long"