ACM中Java\c++字符串的输入方法总结

本文总结了在ACM竞赛中,Java和C++进行字符串输入的方法,包括Java的`next()`和`nextLine()`,以及它们与C++中相应方法的区别。Java的`next()`适合读取单词,而`nextLine()`用于读取整行。注意,非字符串输入后使用`nextLine()`可能导致额外的回车符问题。此外,还介绍了Java中char[]与String的转换技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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();	//字符串
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值