string 类输入
以Java为主体来看:
String[] s= new s[N]; //申请字符串数组
另外Java是不能直接读入char[]型的,但是与String类之间的转换很容易,详情见文末附录
再与c++比较一下
char s[N][N];
string str[N];
Java的字符串读入一般有两种
Scanner sc= new Scanner(System.in);
s[i]=sc.next();
s[i]=sc.nextLine();
next() :
相当于c++中的
scanf("%s",s[i]); //只能用来读char[]
cin>>s[i]; //俩都能读
next用于读入单个单词,以回车、制表、空格为结束标志
会自动吸收单词之前的回车、制表和空格
同时会自动回收结束符
不用管其它输入,无脑读入即可
但弊端在于无法读入空格
nextLine() :
相当于c++中的
getline(cin,str[i]) //只能用来读string
cin.getline(s[i],size); //只能用来读char[]
gets(s[i]); //只能用来读char[]
nextLine用于读入一整行
具体方法:找到当前缓冲区中的第一个回车符,然后返回读取这个回车符之前的所有内容
不会自动吸收缓冲区中的多余空格
但是会自动回收刚刚作为结束标志的那个回车符
而像是sc.nextInt()、scanf("%d",&a)、cin>>(int)a 这类非字符串读入,会自动忽略有效字符前的所有字符,但是并不会顺手自动吸收掉输入后的结束符
随之产生的问题就是:在读取一次非字符串输入后再使用nextLine()时,s[1]读入的将是一个回车符,使得本来想要读入n行单词,结果只读入了前n-1行
处理方法:
public class Main
{
public static void main(String[] args) throws IOException
{
Scanner cin= new Scanner(System.in);
String[] s = new String[n+1];
int n= cin.nextInt();
s[0]=cin.nextLine(); //在读入完非字符串后,加上一个nextLine()来吸收回车符
//但是不能用next(),因为调用next()的话会在吸收掉这个回车符之后紧接着读取掉下一行的字符串,造成之后无法读取到第一个字符串
for(int i=1;i<=n;i++)
{
s[i]=cin.nextLine();
}
cin.close();
for(int i=1;i<=n;i++)
{
System.out.println(s[i]);
}
}
}
就一切正常啦
再看看c++的处理方法
int main()
{
int n;
cin>>n;
getchar(); //最简单的方法就是在非字符串读入之后加一个getchar()
for(int i=1;i<=n;i++)
{
getline(cin,str[i]);
}
for(int i=1;i<=n;i++)
{
cout<<str[i]<<endl;
}
system("pause");
return 0;
}
那先读完一个非字符串,读取了一组字符串,随后又要读取一组怎么办?
问题不大,再加一个循环就是了,nextLine() 会自动吸收掉结束符(回车符)
int main()
{
int n;
cin>>n;
getchar(); //最简单的方法就是在非字符串读入之后加一个getchar()
for(int i=1;i<=n;i++)
{
getline(cin,str[i]);
}
for(int i=n+1;i<=2*n;i++)
{
getline(cin,str[i]);
}
for(int i=1;i<=2*n;i++)
{
cout<<str[i]<<endl;
}
system("pause");
return 0;
}
输出一切正常
附:Java中char[]与String的转换:
char[]到String
String s = String.valueOf('c'); //转换单个字符
char[] cs={'c','h','a','r'}; //将一个char数组转换成String
String s = String.valueOf(cs);
String到char[]
String s="string";
char c=s.charAt(index); //单个字符
char[] cs=s.toCharArray(); //字符串