getchar () не работает хорошо? - PullRequest
       6

getchar () не работает хорошо?

1 голос
/ 09 декабря 2011

Я написал этот код на 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 ]

6 голосов
/ 09 декабря 2011

Как уже указывалось, проблема в том, что в вашем входном буфере была строка для числа И символа новой строки. 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. Поднятие: есть неблокирующая функция ввода, основанная на буфере, но в этом сценарии это, очевидно, не поможет.

Ответ real - это то, что Альф сказал в комментарии. У большинства приличных сред разработки или настроек есть способ настроить его так, чтобы консоль не закрывалась автоматически. Если нет, взломайте его с помощью метода запуска. Черт возьми, вы даже можете поставить точку останова на return 0 в основном!


Примечания:

Вы должны знать, что «правильные» включения 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;
}

Так что постарайтесь урезать свои примеры, чтобы действительно изолировать проблему в будущем! (Не стесняйтесь редактировать свой вопрос, чтобы он был таким кратким, чтобы сделать эту тему более полезной для людей, которые ищут.)

0 голосов
/ 10 октября 2016

именно поэтому они помещают функции isspace и ispunct в ваши собственные прототипы функций и имеют указатели на значения b / c cin >> и "while ((ch = getchar ())! = '\ N')" fpermissive большинство get покончить с этим, используя указатель и размер 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"
0 голосов
/ 09 декабря 2011

Вот два варианта:

  1. getch(); вам придется использовать #include <conio.h>
  2. система ( "пауза");
0 голосов
/ 09 декабря 2011

Попробуйте это:

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

   return 0;
}
0 голосов
/ 09 декабря 2011

Это может быть проблема с буфером.Из-за буфера getChar принимает входные данные из буфера, поэтому лучше будет flush buffer перед вызовом getChar ()

...