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()まだ保留中の改行を取得することも同様です。

getchar()flush()、ignore()、または「呼び出し前にバッファにあったものは何でも」消去するように指示しようとしている人々からのアドバイスを無視してください。これらの関数には、「ノンブロッキング」入力の概念はありません。

別の言い方をすれば、通常の 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;
}

しかし、少なくとも私のマシンでは、それは望ましい効果にはつながりません。つまり、端末アプリまたは OS パイプラインのどこかに改行があっても、内部ストリーム バッファ オブジェクトまで到達していないことを意味しますcin。要するに、バッファに基づいたノンブロッキング入力関数がありますが、この種のシナリオでは明らかに役に立ちません。

本当の答えは、アルフがコメントで言ったことです。ほとんどのまともな開発環境またはセットアップには、コンソールが自動的に閉じないように構成する方法があります。そうでない場合は、起動方法をハックしてください。なんと、return 0メインにブレークポイントを設定することもできます!


ノート:

#include <cfoo>C の互換性ライブラリの「正しい」C++ インクルージョンは、ではなくとして行われることに注意してください#include "foo.h"。実際にはそれほど大きな違いはないかもしれません...しかし、少なくとも、人々がそれについてコメントすると、あなたの質問から気をそらします(私が今やっているように):

C++ で同等の C++ ヘッダーの代わりに C ヘッダーを使用するのは悪い習慣ですか (たとえば、cstdio の代わりに stdio.h)?

また、はるかに小さなサンプルでこれを実証できたはずです! 次のように簡単に効果を示すことができます。

#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 buffergetChar() を呼び出す前に実行することをお勧めします。

于 2011-12-09T08:08:57.923 に答える
0

以下に 2 つの代替案を示します。

  1. getch();あなたは使用する必要があります#include <conio.h>
  2. システム(「一時停止」);
于 2011-12-09T14:19:53.433 に答える
0

それが、彼らが独自の関数プロトタイプに isspace および ispunct 関数を配置し、値へのポインターを持っている理由です b/c cin>> および "while((ch = getchar()) != '\n')" Cstrings関数「strlen()」の戻り値の型であるポインタとサイズtを使用しています

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 プログラミングの例については ... here

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 に答える