笔试中经常会遇到操作字符串,输入输出格式等问题,为了以后不再犯迷糊,在这里总结一下,也希望小伙伴们能够跳过这些坑,专心把思路放到算法设计上来。
1,字符串操作:
题目1:输入一行字符串(中间可能会有空格),然后对该字符串做操作。
坑:在c++中,如果直接cin>>s,在遇到空格和回车时是不区分的,所以导致无法读取一整行字符串。
解决办法:1,使用cin.getline()
char * c; cin.getline(c,100); cout<<c;
输入长度必须小于100,得到的c可以直接转换成string类型,即可方便进行处理。 即:string s=c;
2.使用gets()
char c[100]; gets(c); string s=c; cout<<s<<endl;
这里c[100]不能用char * c代替。
3,使用getline(cin,string s)
string line; getline(cin,line); cout<<line<<endl;
该方法好处是不用限制长度,而且比较简洁。所以一般我都用这个。
Java里面输入相对来说就比较固定了,直接用Scanner类来实现.
class Test{ public static void main(String[] args){ Scanner sc=new Scanner(System.in); String s=sc.nextLine(); System.out.println(s); } }
2.Java和c++中的String(string)类的操作
字符串操作很重要,如果用char* char[] 来操作会大大影响效率,而且笔试时间很短,所以熟练掌握string类的基本操作很有必要
c++和java 的字符串类都提供了很多相似的功能:
获取i位置的字符
java: charAt(i) c++: 直接用下标 s[i] 或者 s.at(i)
连接
java: Stringbuilder append() (string类有+ 和concat()方法,但是无法直接改变字符串内容,而是以返回值的形式得到连接后的字符串) c++ : string 类 append() 注意java里可以连接char ,c++里面不可以连接char。
获取字符串长度:
java和c++都是 s.length()
这里补充一个易混淆的地方:size()方法是集合类里面求长度用的,length是java数组的长度,c++数组长度要用sizeof()/sizeof(),求char * c 的长度用strlen(c)。
子串:
java : s.substr(m,n) 返回s从m到n的字符串 c++: s.substr(m,n)返回从m开始的n个字符组成的子串。
替换:
java: s.replace(char old,char new) c++:s.replace(int initpos, int len,"newstring")
c++特有的方法 reverse(s.begin()+m,s.end()+n); 要引用头文件 #include <algorithm>
java特有的方法
indexOf(char c) s.toCharArray() s.split() ...等等
详细的自行查看api,常用的记住就好了。
3.有关结构体
结构体在做数据结构题目时会用到,然后自己曾经犯了阵模糊,这里用代码的形式总结一下:
#include<iostream> #include<string> using namespace std; struct Test1 { int a; }t; //t在这里相当于: struct Test1 t;即顺便生成了一个实例t struct { int a; } tt; typedef struct Test2 { int a; } test,*ptest; int main() { struct Test1 t0; //这个是c语言的声明方法,比较繁琐,struct不能省略 t0.a=3; Test1 t1; //声明一个Test1结构体的变量t1,可以直接使用。最常用的方式 t1.a=3; Test1 *pt1=new Test1(); //这里结构体跟类很相似,用new生成一个实例对象 pt1->a=3; Test1 *pt2=new Test1; pt2->a=3; t.a=3; //如上所述,t已经是个实例了 test t2; //typedef的用法,这里test就相当于 struct Test2,其实在c++里面不用这样也行,直接用 t2.a=3; tt.a=3; //c++里面结构体可以不命名直接给出一个实例。 cout<<t0.a<<endl; cout<<t1.a<<endl; cout<<pt1->a<<endl; cout<<pt2->a<<endl; cout<<t.a<<endl; cout<<t2.a<<endl; cout<<tt.a<<endl; //初始化 Test1 ttt{3}; //c++可以省略= cout<<ttt.a<<endl; Test1 s={3}; //c不可以省略= cout<<s.a; }