2

我用 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;

}
4

5 回答 5

7

正如已经指出的那样,问题在于您的输入缓冲区有一个数字字符串和一个换行符。C++ I/O 在读取类似数字的内容时会跳过前导空格,但不会将尾随空格从缓冲区中取出。它留给下一次阅读处理。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. 结果是:有一个基于缓冲区的非阻塞输入函数,但在这种情况下,它显然无济于事。

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


笔记:

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

在 C++ 中使用 C 头文件而不是其 C++ 等效项(例如 stdio.h 而不是 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;
}

因此,请尝试减少您的示例,以便将来真正隔离问题!(请随意编辑您的问题,使其简洁,以使该线程对人们搜索更有用。)

于 2011-12-09T08:53:49.090 回答
1

试试这个:

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

   return 0;
}
于 2011-12-09T08:12:49.290 回答
0

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

于 2011-12-09T08:08:57.923 回答
0

这是两个替代品:

  1. getch();你将不得不使用#include <conio.h>
  2. 系统(“暂停”);
于 2011-12-09T14:19:53.433 回答
0

这就是为什么他们把 isspace 和 ispunct 函数放在你自己的函数原型中,并且有指向值 b/c cin>> 和 "while((ch = getchar()) != '\n')" 的指针正在使用指针和大小 t,它是 Cstrings 函数“strlen()”的返回类型

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++ 代码,则必须从头开始制作自己的函数...或尝试使用其中带有 * 的糟糕函数

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"
于 2016-10-10T07:47:18.547 回答