簡體   English   中英

在C ++中使用getChar()讀取數字

[英]Reading numbers with getChar() in C++

我想做一個函數,以最快的方式從stdin讀取整數。 更具體地說,我有一個很長的int序列,用EOF結束的空格分開,我必須在上面進行一些操作。 我使用了cin但由於此功能在其功能上相當強大,所以我想做一些更小,更具體的東西,從而更快,更高效。 我讀過,讀取stdin的快速方式是getChar()函數。 我已經在C中找到了此問題的一些實現,但是chars只是整數的另一種形式,而在C ++中則不是。 我的想法是使類型為bool

bool myIntRead( int *num);

它基本上會讀取一個整數的字符,直到一個“空格符號”,然后以某種方式將這些字符放回一個int數。 bool類型將用於通知stdin為空。

int main() {
    int num;
    while (myIntRead(&num) ) {
        myIntRead(&num)
        //some operations on num
    }
}

我完全知道,這種處理輸入的過程要復雜得多,也要困難得多,但是我真的很想找到解決該問題的方法。 在找出該概念的實現方面,我將非常感謝你們的幫助。 最好的祝福!

如果您只想處理ASCII輸入,並且確定輸入將以期望的格式提供給您(即數字0-9,后跟b空格),那么您要做的就是讀取每個字符,然后:

  • 確定是空格還是數字
  • 如果是空格,請開始閱讀新數字
  • 如果是數字,請在當前數字后附加數字

下面說明了這一點。 但是它不處理任何溢出,也沒有停止條件。

int c;
int current_number;
std::vector<int> numbers;


do {
   c = getchar();

   if(c == 0x20)                      // it's a space
   {
       numbers.push_back(current_number);    // add the current number to the list of numbers
       current_number = 0;                   // reset the current_number variable back to 0
   }else if(c >= 0x30 && c <= 0x39)   // it's a digit
   {
       current_number = current_number * 10 + (c - 0x30);   // add next digit..
       // you may want to deal with overflow here (ie. if number of digits > MAX_DIGITS or similar)
   }

} while (TRUE);           // there should be a stop condition here..

以下代碼在61毫秒(已有幾年時間的普通PC)中讀取了1000000(百萬)個數字。 該文件的大小為3.8MB。

#include <iostream>
#include <fstream>
#include <iterator>
#include <vector>

template< typename T, typename Out >
struct IntReader_type
{
    IntReader_type( Out out ) : out_( out ) {}
    template< typename E, typename Traits >
    friend std::basic_istream< E, Traits >& operator>>( std::basic_istream< E, Traits >& in, IntReader_type rdr )
    {
        std::basic_istream< E, Traits >::sentry ok( in );
        if( ok )
        {
            std::ios_base::iostate state = std::ios_base::goodbit;
            try
            {
                const std::ctype< E >& ct = std::use_facet< std::ctype< E > >( in.getloc() );
                while( state == std::ios_base::goodbit )
                {
                    T result = T(0);
                    for( Traits::int_type m = in.rdbuf()->sgetc(); ; m = in.rdbuf()->snextc() )
                    {
                        if( Traits::eq_int_type( m,  Traits::eof() ) )
                        {
                            state |= std::ios_base::eofbit; // EOF is not an error
                            break;
                        }
                        const E c = Traits::to_char_type( m );
                        if( ct.is( std::ctype_base::space, c ) )
                            break;
                        if( ct.is( std::ctype_base::digit, c ) )
                        {
                            (result *= 10) += T(c - E('0'));
                        }
                        else
                        {
                            state |= std::ios_base::failbit; // not a digit
                            break;
                        }
                    }
                    *(rdr.out_)++ = result; // store the number
                    // skip white space character
                    for( Traits::int_type m = in.rdbuf()->sgetc(); ; m = in.rdbuf()->snextc() )
                    {
                        if( Traits::eq_int_type( m,  Traits::eof() ) )
                        {
                            state |= std::ios_base::eofbit;
                            break;
                        }
                        if( !ct.is( std::ctype_base::space, Traits::to_char_type( m ) ) )
                            break;
                    }
                }
            }
            catch( ... )
            {
                state |= std::ios_base::badbit;
                if( in.exceptions() & std::ios_base::badbit )
                    throw;
            }
            in.setstate( state );
        }
        return in;
    }
private:
    Out out_;
};
template< typename T, typename Out >
IntReader_type< T, Out > read_ints( Out out )
{
    return IntReader_type< T, Out >( out );
}

以這種方式調用Integer-reader:

vector< int > numbers;
if( cin >> read_ints< int >( back_inserter(numbers) ) ) 
{   // read is done without error

注意-在此版本中,只能讀取無符號數字,並且不檢查整數溢出。

好的,所以c = getchar();

您必須將其存儲在數組中才能處理。

如果c包含一位,則乘以c [0] * 1。

如果c包含兩位數字,請乘以c [1] * 1 + c [0] * 10。

如果c包含三個數字,則將c [2] * 1 + c [1] * 10 + c [0] * 100乘以。

如果c包含四個數字,則乘以c [3] * 1 + c [2] * 10 + c [1] * 100 + c [0] * 1000,依此類推。

輸入代碼如下所示:

   while(digitInput!=13)
   {
       if (kbhit())
       {
           digitInput=getch();
           if (digitInput==27) exit(0);

           if ((digitInput>47) && (digitInput<59))
           {
             digitArray[digit]=(unsigned char)digitInput-48;
             digit++;

             printf("%d",digitInput-48);

           }
           if (digitInput==13)  { digitn=digitArray[0]; break; }
       }
   }



switch(digit)
   {
       case 0:
       case 1:
            digitn=digitArray[0]*1 ;
       break;

       case 2:
            digitn= digitArray[1]*1  +digitArray[0]*10  ;
       break;

       case 3:
            digitn=  digitArray[2]*1+digitArray[1]*10 +digitArray[0]*100  ;
       break;

       case 4:
             digitn=digitArray[3]*1+digitArray[2]*10+digitArray[1]*100+digitArray[0]*1000 ;
       break;
}

代碼中完整的應用程序。

#include <iostream.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>


int digit=0,digitInput=0;
int digitArray[10]={0},digitn;
int numberOfInputDigits=4;

/*********************************
 *                               *
 ********************************/

void getIntKey(void)
{
   digitArray[0]=0;
   digitArray[1]=0;
   digit=0;
   digitInput=0;

   while(digitInput!=13)
   {
       if (kbhit())
       {
           digitInput=getch();
           if (digitInput==27) exit(0);

           if ((digitInput>47) && (digitInput<59))
           {
             digitArray[digit]=(unsigned char)digitInput-48;
             digit++;

             printf("%d",digitInput-48);

           }
           if (digitInput==13)  { digitn=digitArray[0]; break; }
       }
   }

   switch(digit)
   {
       case 0:
       case 1:
            digitn=digitArray[0]*1 ;
       break;

       case 2:
            digitn= digitArray[1]*1  +digitArray[0]*10  ;
       break;

       case 3:
            digitn=  digitArray[2]*1+digitArray[1]*10 +digitArray[0]*100  ;
       break;

       case 4:
             digitn=digitArray[3]*1+digitArray[2]*10+digitArray[1]*100+digitArray[0]*1000 ;
       break;

       case 5:
             digitn=digitArray[4]*1+digitArray[3]*10+digitArray[2]*100+digitArray[1]*1000+digitArray[0]*10000 ;
       break;

       case 6:
             digitn=digitArray[5]*1+digitArray[4]*10+digitArray[3]*100+digitArray[2]*1000+digitArray[1]*10000 
                   +digitArray[0]*100000;
       break;


       case 7:
             digitn=digitArray[6]*1+digitArray[5]*10+digitArray[4]*100+digitArray[3]*1000+digitArray[2]*10000 
                   +digitArray[1]*100000 +digitArray[0]*1000000;
       break;


       case 8:
             digitn=digitArray[7]*1+digitArray[6]*10+digitArray[5]*100+digitArray[4]*1000+digitArray[3]*10000 
                   +digitArray[2]*100000 +digitArray[1]*1000000+digitArray[0]*10000000;
       break;

       case 9:
             digitn=digitArray[8]*1+digitArray[7]*10+digitArray[6]*100+digitArray[5]*1000+digitArray[4]*10000 
                   +digitArray[3]*100000 +digitArray[2]*1000000+digitArray[1]*10000000 +digitArray[0]*100000000;
       break;


   }


  // if (digitInput!=13)  digitn=digitArray[3]*1+digitArray[2]*10+digitArray[1]*100+digitArray[0]*1000 ;
   printf("\n%i\n\n",digitn);
}

/*********************************
 *                               *
 ********************************/

int main()
{
    system("color 1F");     //Blue background       
   printf("Digits Into decimal numbers \n ");
   printf("Max Input is %d Digits   \n ",numberOfInputDigits);
   printf("\nInput Digit >");
   getIntKey();

   printf("\nThe input was   digitArray[7]=%d \n",digitArray[7]);

   printf("digitArray[6]=%d \n",digitArray[6]);
   printf("digitArray[5]=%d \n",digitArray[5]);
   printf("digitArray[4]=%d \n",digitArray[4]);

   printf("digitArray[3]=%d \n",digitArray[3]);
   printf("digitArray[2]=%d \n",digitArray[2]);
   printf("digitArray[1]=%d \n",digitArray[1]);
   printf("digitArray[0]=%d \n",digitArray[0]);
   printf("\n%i\n\n",digitn);




    return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM