You can not use isalpha
as you used it:
if(isalpha(dados.nome[tam])){
So you are only using in a caratere 50
that is already outside the valid range in your case, which would be 0
to 49
. So just know if that caratere is a letter.
In order to do the validation you want, you must use isalpha
on each caratere, thus validating all are letters. I suggest creating a function for this check only:
int apenas_letras(char *texto){
int i;
for (i = 0; texto[i] != 'if(apenas_letras(dados.nome)){ //<--aqui
printf("Nome: %s\n",strupr(dados.nome));
}else{
printf("Insira somente letras.\n");
}
'; ++i){ //percorrer todos os carateres
if (!isalpha(texto[i]) && texto[i] != ' '){ //se não for letra nem espaço
return 0; //retornar 0 indicando que não tem somente letras
}
}
return 1; //retornar 1 indica que só tem letras
}
Note that I individualized the space so that it is also considered as a letter. You can remove this additional test if that is not your goal.
Now just use the main
you already have:
size_t tam_nome = strlen(dados.nome);
if (dados.nome[tam_nome - 1] == '\n'){
dados.nome[tam_nome - 1] = 'char* strupr(char *str){
size_t str_size = strlen(str); //saber o tamanho da que entrou
//criar espaço para a nova mais o terminador
char *upr = malloc(sizeof(char) * (str_size + 1));
if (!upr){ //se não deu para alocar memoria
return NULL; //retorna NULL como indicando que algo falhou
}
int i;
for (i = 0; str[i] != 'if(isalpha(dados.nome[tam])){
'; ++i){ //percorrer a antiga
upr[i] = toupper(str[i]); //converter cada letra para maiuscula
}
upr[i] = 'int apenas_letras(char *texto){
int i;
for (i = 0; texto[i] != 'if(apenas_letras(dados.nome)){ //<--aqui
printf("Nome: %s\n",strupr(dados.nome));
}else{
printf("Insira somente letras.\n");
}
'; ++i){ //percorrer todos os carateres
if (!isalpha(texto[i]) && texto[i] != ' '){ //se não for letra nem espaço
return 0; //retornar 0 indicando que não tem somente letras
}
}
return 1; //retornar 1 indica que só tem letras
}
'; //colocar o terminador no fim da convertida
return upr;
}
';
}
Also note that to work correctly you have to treat the string
that is dealt with fgets
because it leaves the \n
read at the end, which will interfere with the validation. You can remove it as follows:
size_t tam_nome = strlen(dados.nome);
if (dados.nome[tam_nome - 1] == '\n'){
dados.nome[tam_nome - 1] = 'char* strupr(char *str){
size_t str_size = strlen(str); //saber o tamanho da que entrou
//criar espaço para a nova mais o terminador
char *upr = malloc(sizeof(char) * (str_size + 1));
if (!upr){ //se não deu para alocar memoria
return NULL; //retorna NULL como indicando que algo falhou
}
int i;
for (i = 0; str[i] != '%pre%'; ++i){ //percorrer a antiga
upr[i] = toupper(str[i]); //converter cada letra para maiuscula
}
upr[i] = '%pre%'; //colocar o terminador no fim da convertida
return upr;
}
';
}
I still leave one last note that the strupr
function you are using is not standard, and that for some operating systems it will not have implementation.
Example of this Ideone solution
I took strupr on Ideone to work
Edit :
As an alternative to strupr
I recommend implementing it manually even though it is a small and pretty simple function. In this sense I could implement it like this:
%pre%
The conversion to uppercase was done using the toupper
function on each letter.
This implementation maintains the semantics of the strupr
function you were using. I particularly do not like this semantics because memory is allocated within the function with malloc
. This implies that unless the program is terminated then it will be necessary to free the memory of% converted% with % with% / a>, otherwise you may have a memory leak.