简体   繁体   English

如何在c中读取带有空格的字符串?

[英]How to read a string with spaces in c?

I read online that fgets can do it but I'm only familiar with scanf, and couldn't understand how to use fgets properly.我在网上看到fgets可以做到,但我只熟悉scanf,不明白如何正确使用fgets。 I'm a beginner so the main part of what I don't understand about fgets is the third parameter.我是初学者,所以我不了解 fgets 的主要部分是第三个参数。

#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);
    }
}

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 scanf正在寻找一个字符串,然后寻找一个s并且不使用新行

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(" %49[^\n] ", nome_resp);

or even better still to check the return value甚至更好地检查返回值

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

This is how to use fgets.这是使用 fgets 的方法。 Syntax:句法:

    fgets(var_name,MAX_VALUE,stdin);

Example:例子:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM