Estou com um probleminha em um exercício que pede para o usuário digitar o nome do estado (ex: São Paulo, Pernambuco, Paraíba etc.) e posteriormente retorna a sigla (ex: SP, PE, PB etc.). Mas quando digitado São Paulo, o programa só imprime a primeira letra S... alias, até imprime uma possível segunda letra para a sigla, mas pelo tamanho da string, imprime o espaço entre as duas palavras
...
Pelos testes que fiz usando o gdb, percebi que se digitar Sao Paulo (sem o '~') imprime a saída 'SP'. A função strlen() retorna tamanhos diferentes para cada caso. O que poria ser?
Compilado com $gcc -Wall -ggdb -o programa programa.c
no ubuntu 10.10 e gcc-4.3.
Logo abaixo, o código:
(obs.: Sei que o código está muito amador e sujo, mas foi isso que saiu...)
/*
12.6.7 Escreva um programa em C que recebe via teclado o nome de um
estado (máximo 80 caracteres). Logo após a entrada do nome do estado
imprima: a sigla do estado (2 letras maiúsculas), conforme exemplos
abaixo:
Exemplo:
Estado: Rio Grande do Sul <enter>
Sigla: RS
Estado: são paulo <enter>
Sigla: SP
Estado: rio de janeiro <enter>
Sigla: RJ
Estado: <enter>
Observação: O programa encerra quando o usuário digitar apenas <enter> na entrada do nome do estado.
*/
#include <stdio_ext.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int main(void)
{
char *nome=malloc(80*sizeof(char));
int tam, i = 0;
do {
fputs("\nEstado, ou [ENTER] para sair: ", stdout);
fgets(nome, 80, stdin);
if(nome[0]=='\n') break;
tam=strlen(nome);
tam--;
/** breackpoint gdb **/
// Primeira letra da Sigla ///
fprintf(stdout, "Sigla: %c", toupper(nome[0]));
// Laço para segunda letra da Sigla ///
for(i=tam; i>0; i--) {
// Casos 1º Amapá AP ( Incompatibilade na sequencia ) ///
if( toupper(nome[0]) == 'A' && toupper(nome[3]) == 'P' ) {
fprintf(stdout, "%c", toupper(nome[3]));
break;
}
// Casos 2º Mato Grosso MT ( Incompatibilade na sequencia ) ///
if( toupper(nome[5]) == 'G' && tam < 14 ) {
fprintf(stdout, "%c", toupper(nome[2]));
break;
}
// Casos 3º Paraiba PB ( Incompatibilade na sequencia ) ///
if(toupper(nome[5]) == 'B') {
fprintf(stdout, "%c", toupper(nome[5]));
break;
}
// Casos 4º Parana PR ( Incompatibilade na sequencia ) ///
if(toupper(nome[0]) == 'P' && toupper(nome[4]) == 'N') {
fprintf(stdout, "%c", toupper(nome[2]));
break;
}
// Casos 5º Roraima RR ( Incompatibilade na sequencia ) ///
if(toupper(nome[0]) == 'R' && toupper(nome[2]) == 'R') {
fprintf(stdout, "%c", toupper(nome[2]));
break;
}
// Casos 6º São Paulo SP ( Incompatibilade na sequencia ) ///
if(toupper(nome[0]) == 'S' && toupper(nome[4]) == 'P') {
fprintf(stdout, "%c", toupper(nome[4]));
break;
}
// Para segunda letra das Siglas compostas (dois ou mais nomes) ///
if(nome[i] == ' ' && tam>=9) {
fprintf(stdout, "%c", toupper(nome[i+1]));
break;
}
// Para segunda letra das siglas simples (Somente um nome) ///
if(nome[i]!=' ' && tam<=10) {
fprintf(stdout, "%c", toupper(nome[1]));
break;
}
}
} while(1);
free(nome);
return 0;
}