关于使用 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()
的功能都是从输入缓冲区中读取一个字符,因此当想用cin
和cout
作为输入输出函数时,尽量用cin.get()
,而不要用getchar()
。
本文来自博客园,作者:江上舟摇,转载请注明原文链接:https://www.cnblogs.com/LQS-blog/p/16227200.html