I want to check if the string contains only letters?

4
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<string.h>
#define tam 50

main(){
    struct cadastro{
        char nome[tam];
    };
    struct cadastro dados;

    printf("Nome:");
    fgets(dados.nome,tam,stdin);
    fflush(stdin);

    if(isalpha(dados.nome[tam])){  //verificar se são letras
        printf("Nome: %s\n",strupr(dados.nome));  //converter para letra maiuscula
    }else{
        printf("Insira somente letras.\n");
    }

    system("pause > NULL");
    return (0);
}
    
asked by anonymous 02.04.2018 / 04:14

1 answer

6

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.

    
02.04.2018 / 04:57