Home > front end >  How to read a string with spaces in c?
How to read a string with spaces in c?

Time:06-29

I read online that fgets can do it but I'm only familiar with scanf, and couldn't understand how to use fgets properly. I'm a beginner so the main part of what I don't understand about fgets is the third parameter.

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <string.h>

void funcCadastroDados();

int main(){
    setlocale(LC_ALL, "Portuguese");
    funcCadastroDados();
}

void funcCadastroDados(){
    system("cls");
    char tipo_usuario[20], nome_resp[50], nome_crianca[50], transtorno_crianca[50], email_resp[50], nome_edu[50], nome_crianca_associada[50], email_edu[50];
    int cpf_resp, tel_resp, cpf_edu, tel_edu;
    printf("Você é pai/responsável da criança ou educador? \nDigite 'responsavel' ou 'educador' \n");
    scanf("%s", tipo_usuario);
    if ((strcmp(tipo_usuario, "responsavel")) == 0){
        printf("Insira o nome do responsável: \n");
        scanf("%[^\n]s", nome_resp);//fgets(nome_resp, 50, stdin);
        printf("Insira o CPF do responsável: \n");
        scanf("%d", &cpf_resp);
        printf("Insira o nome da criança: \n");
        scanf("%[^\n]s", nome_crianca);//fgets(nome_crianca, 50, stdin);
        printf("Insira o transtorno mental que a criança possui: \n");
        scanf("%[^\n]s", transtorno_crianca);//fgets(transtorno_crianca, 50, stdin);
        printf("Insira o telefone do responsável: \n");
        scanf("%d", &tel_resp);
        printf("Insira o email do responsável: \n");
        scanf("%s", email_resp);
        
        printf("\nSeus dados são: \n Nome do responsável: %s \n CPF do responsável: %s \n Nome da criança: %s \n Transtorno mental: %s \n "
        "Telefone do responsável: %d \n Email do responsável: %s \n", nome_resp, cpf_resp, nome_crianca, transtorno_crianca, tel_resp, email_resp);
    }
    else if ((strcmp(tipo_usuario, "educador")) == 0){
        printf("Insira o nome do educador: \n");
        scanf("%[^\n]s", nome_edu);//fgets(nome_edu, 50, stdin);
        printf("Insira o CPF do educador: \n");
        scanf("%d", &cpf_edu);
        printf("Insira o nome da criança associada a este educador: \n");
        scanf("%[^\n]s", nome_crianca_associada);//fgets(nome_crianca_associada, 50, stdin);
        printf("Insira o telefone do educador: \n");
        scanf("%d", &tel_edu);
        printf("Insira o email do educador: \n");
        scanf("%s", email_edu);
        printf("\nSeus dados são: \n Nome do educador: %s \n CPF do educador: %s \n Nome da criança associada: %s \n Telefone do educador: %d \n"
        "Email do educador: %s \n", nome_edu, cpf_edu, nome_crianca_associada, tel_edu, email_edu);
    }
}

CodePudding user response:

This is so wrong in so many ways

scanf("%[^\n]s", nome_resp);//fgets(nome_resp, 50, stdin);

The scanf is looking for a string then looks for an s and does not consume the new line

This would be better

scanf("%[^\n] ", nome_resp);

or even better still to not overflow the character array and to consume white space (new lines etc)

scanf(" I[^\n] ", nome_resp);

or even better still to check the return value

if (scanf(" I[^\n]", nome_resp) != 1) {
   ... Error has occurred ... handle that

CodePudding user response:

This is how to use fgets. Syntax:

    fgets(var_name,MAX_VALUE,stdin);

Example:

char name[] = "";
fgets(name,65535,stdin);
  • Related