關於使用 std::ios::sync_with_stdio(false)出現的問題以及解決方案
阿新 • • 發佈:2022-05-06
昨天在做杭電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 } 32printf("\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()
的功能都是從輸入緩衝區中讀取一個字元,因此當想用cin
和cout
作為輸入輸出函式時,儘量用cin.get()
,而不要用getchar()
。