Ta certo. Cara você tem que entender o que esta sendo feito no seu código. Melhor você postar aqui que não entendeu o que esta sendo feito do que ficar postando cada erro que você pegar.
Primeiro substitui esses dois if’s por esse aqui.
if(s.toLowerCase().contains("ç"))
Vindo ‘ç’ ou ‘Ç’ ele vai transformar em minuscula e comparar corretamente sem ter que fazer dois if’s, ok?
Esse erro esta dando pois você esta tentando pegar a posição 18 em um string que não tem esse tamanho, tipo se a string tiver tamanho 16, você tenta pegar a posição 18, vai dar erro né. Se realmente tiver certo isso, de poder ter código com menos de 18 posições, você tem que verificar antes de tentar pegar. ex.:
// se o tamanho da string for menor que 18
if(s.length() < 18){
// voce vai pegar o tamanho da string no lugar de 18
vcodigocarteirinha = s.substring(s.indexOf("ç"), s.indexOf("ç")+s.length());
} else {
// senão voce pega o 18 mesmo
vcodigocarteirinha = s.substring(s.indexOf("ç"), s.indexOf("ç")+18);
}
Seu código vai ficar assim.
for(String s : strSplit){
if(s.toLowerCase().contains("ç")){
// se o tamanho da string for menor que 18
if(s.length() < 18){
// voce vai pegar o tamanho da string no lugar de 18
vcodigocarteirinha = s.substring(s.toLowerCase().indexOf("ç"), s.toLowerCase().indexOf("ç")+s.length());
} else {
// senão voce pega o 18 mesmo
vcodigocarteirinha = s.substring(s.toLowerCase().indexOf("ç"), s.toLowerCase().indexOf("ç")+18);
}
}
System.out.println(vcodigocarteirinha);
}
Entendeu? Mas não esqueça que mais importante que fazer funcionar é entender o seu código.
[]'s