1.23日的小小小总结!!!
1)抛弃了gets,知道了打比赛不能用gets!!
gets的替换方法如下:
一、用%c循环输入直到遇到换行结束
#include <iostream> #include <cstdio> #include <cstring> using namespace std; int main() { char str[100]; char ch; int i=0; while(scanf("%c",&ch)&&ch!='\n') { str[i++]=ch; } str[i]='\0'; //手动把字符串末尾字符赋成'\0'!!非常重要! cout<<str<<endl; return 0; }
二、用getchar()循环输入直到遇到换行结束
这个方法从原理是跟上面的方法是一样的,只是写法不一样,下面直接放上参考代码:(值得注意的是末尾仍要赋成'\0')
#include <iostream> #include <cstdio> #include <cstring> using namespace std; int main() { char str[100]; char ch; int i=0; while(c=getchar()!='\n') { str[i++]=ch; } str[i]='\0'; //手动把字符串末尾字符赋成'\0'!!非常重要! cout<<str<<endl; return 0; }
三、scanf的另一种用法
我们知道用scanf的%s可以用来输入一个字符串,但是%s遇到空格之后便停止了,不能达到输入空格的效果,所以我们可以使用另一种方法:
这样想读入一行字符串直接用scanf("%[^\n]%*c",str);
就可以了,%*c的作用是读入\n,否则后面读入的将一直是\n。
#include <iostream> #include <cstdio> #include <cstring> using namespace std; int main() { char str[100]; char ch; int i=0; scanf("%[^\n]%*c",str); cout<<str<<endl; return 0; }
看似很复杂的一句代码,下面我们来解读一下:
这句话的意思是碰见了回车就退出,然后把缓冲区里面的内容按字符串格式输入str中,回车依然留在缓冲区。
其中"%[^\n]"表示读入一个字符串,遇到'\n'停止,并设置末尾的'\0'。^ 是“非”的意思,意思就是说把一个非“\n”字符读入字符串,直到遇到“\n”停止输入。
而“%*c”呢,则是代表读入一个字符到缓冲区,但是不向任何地方输入。这样,就解决了字符串后边的“\n”对下面数据的影响,如果不加“%*c”的话,则大多数情况下需要在scanf前加一句getchar()来消除回车的影响。
附加补充!!!
所有对%s起作用的控制都可以用%[ ],比如%[0-9]表示只读入'0'到'9'之间的字符,%[a-zA-Z]表示只读入字母,
'-'是范围连接符,当然也可以直接列出你需要读入的字符。
如果你只需要读"abc"里面的字符就可以用%[abc] (或者%[cab]、%[acb]、%[a-c]、%[c-a].....),
如果想读入某个范围之外的字符串就在前面加一个'^',如:%[^a-z]就表示读入小写字母之外的字符。
例如从键盘输入的"1235ab86"中读取1235、86给n,有如下方法:
#include <stdio.h> bool skip(){ scanf("%*[^0-9]"); return true; } int main() { int n; while(skip() && scanf("%d", &n)!=EOF) printf("%d\n", n); return 0; }
输入12312ab78
结果如下:
四、c++中的getline()方法
getline不是C库函数,而是gcc的扩展定义或者C++库函数。它会生成一个包含一串从输入流读入的字符的字符串。
具体用法:未完待续!!!!1.24日
2)合理地运用了所学的知识,用空间换时间,学会了一边输入一遍存储,将第二次不必要的遍历舍弃,优化了算法,成功过题!!(当时想到的是利用数组下标来优化算法,借助这一点想到了求前n项和,再相减,则得到了两者之间的和)
题目链接:https://ac.nowcoder.com/acm/contest/11471/C
#include <cstdio> #include <cstring> #include <algorithm> #include <iostream> using namespace std; int a[1000005]; int b[1000005]; int main() { int n,m,i=1,j=1; int sum=0; int d1,d2; scanf("%d%d",&n,&m); for(;i<=n;i++) { scanf("%d",&a[i]); b[i]=a[i]+b[i-1]; //一边输入一遍存a[1]~a[i]的和 //从而降低复杂度,用空间换取时间 } for(;j<=m;j++) { scanf("%d%d",&d1,&d2); sum=b[d2]-b[d1-1]; printf("%d\n",sum); sum=0; } return 0; }
3)用bool型函数写cmp,非void函数一直要确保有返回值!!
且慎用if else 一定要包括所有情况,否则编译器会认为有其他情况!!!
像这样就是错误的,有if和else if尽管此时已经包括了所有情况,但是逻辑上有问题,实际上应该用if else才是合理的,修改后如下:
以上两者虽然读起来确实表达意思是一样的,但在编译器看来就是有逻辑问题。