不守標準出了名的M$

問題

今天有人問了這樣一個問題,如何不讓scanf取得指定長度後剩下的字元,被下一個scanf取得

解法

首先我想到的是scanf一個字串,可是如果字串長度剛好,就會造成要再輸入一次,於是我又想到了fflush來清空stdin的緩衝區,查了MSDN,也寫了一個小程式來測試,果然可行,但是…

但是

但是有人說fflush(stdin)不合C語言標準,起先我懷疑真的是這樣嗎? 因為我查MSDN是這樣寫沒錯阿,還有範例示範呢

/* FFLUSH.C */

#include
#include

void main( void )
{
   int integer;
   char string[81];

   /* Read each word as a string. */
   printf( "Enter a sentence of four words with scanf: " );
   for( integer = 0; integer < 4; integer++ )
   {
      scanf( "%s", string );
      printf( "%sn", string );
   }

   /* You must flush the input buffer before using gets. */
   fflush( stdin );
   printf( "Enter the same sentence with gets: " );
   gets( string );
   printf( "%sn", string );
}

上網一找,找到文章說fflush果然不是標準

文章

正確的做法應該要自己一個一個地吃掉字元,話說M$真的很不愛守標準,我一直都很相信MSDN,沒想到今天被它給騙了 囧rz,下次看MSDN應該要帶一點懷疑,不過不可否認地,在這裡這樣的不標準確實比標準來得方便

This entry was posted in C/C++, 中文文章 and tagged , , , , . Bookmark the permalink.

2 Responses to 不守標準出了名的M$

  1. QoQQ says:

    這個問題我也碰過. 問題是. 當用getch 一個一個把字吃掉. 最後沒輸入. 程式會block 住. 真不知道怎麼解決.

  2. TOCK says:

    可以用 _getch() 來自己寫一個 scanf 之類的,不過會花很多功夫,而且 _getch() 好像也不是標準。