1. 程式人生 > 其它 >關於使用 std::ios::sync_with_stdio(false)出現的問題以及解決方案

關於使用 std::ios::sync_with_stdio(false)出現的問題以及解決方案

昨天在做杭電1062的時候出現了一個問題:

就是關於使用cin和scanf輸入變數n所出現的執行結果不一致,甚至是用了cin之後出現了超時的現象;

今天早上這個問題解決了

我以為是編譯器的問題,但是從dev換到codeblock結果是一樣的

 

 之後進行了一下實驗,發現

 使用cin之後出現錯誤的原因就是使用了ios::sync_with_stdio(false)

這是沒有修改之前的程式碼:

 1 #include<bitsdc++.h>
 2 using namespace std;
 3 int main()
 4 {
 5     std::ios::sync_with_stdio(false
); 6 cin.tie(0); 7 cout.tie(0); 8 int n; 9 char ch; 10 cin>>n; 11 getchar(); 12 while(n--) 13 { 14 stack<char>s; 15 while(true) 16 { 17 ch=getchar(); 18 if(ch==' '||ch=='\n') 19 { 20 while
(!s.empty()) 21 { 22 printf("%c",s.top()); 23 s.pop(); 24 } 25 if(ch=='\n') 26 break; 27 printf(" "); 28 } 29 else 30 s.push(ch); 31 } 32
printf("\n"); 33 } 34 return 0; 35 }

執行結果是這樣的:

而用了scanf之後的程式碼:

 1 #include<bitsdc++.h>
 2 using namespace std;
 3 int main()
 4 {
 5     std::ios::sync_with_stdio(false);
 6     cin.tie(0);
 7     cout.tie(0);
 8     int n;
 9     char ch;
10     scanf("%d",&n);//cin>>n;
11     getchar();
12     while(n--)
13     {
14         stack<char>s;
15         while(true)
16         {
17             ch=getchar();
18             if(ch==' '||ch=='\n')
19             {
20                 while(!s.empty())
21                 {
22                     printf("%c",s.top());
23                     s.pop();
24                 }
25                 if(ch=='\n')
26                 break;
27                 printf(" ");
28             }
29             else
30             s.push(ch);
31         }
32         printf("\n");
33     }
34     return 0;
35 }

執行結果是這樣的:

混用了cin的優化和scanf導致了中間輸出的字母h被吃掉了

 C++的輸入輸出操作cin和cout使用起來比scanf和printf要方便,因為它在輸入和輸出時不用指明資料型別,系統會自動判斷。但是cin和cout也有它的缺點,就是輸入輸出較scanf和printf而言要慢,因此很多人寫程式碼時會加上句ios::syn_with_stdio(false)來提高cin和cout的效率,但這樣容易引發各種問題,所以還是小心為上;

那麼是不是說明上述程式碼的功能就無法在gcc中實現了呢?

非也,也是可以的,在處理輸入字元的時候特別要小心,因為我們以前使用ios優化輸入整數的時候都沒問題,唯獨到了輸入字元的時候出了岔子,

所以說我們可以使用cin.get()來代替getchar();

cin.get()getchar()的功能都是從輸入緩衝區中讀取一個字元,因此當想用cincout作為輸入輸出函式時,儘量用cin.get(),而不要用getchar()