【问题标题】:fgets doesn't wait for user input in my C codefgets 不会在我的 C 代码中等待用户输入
【发布时间】:2021-08-11 04:56:29
【问题描述】:

我正在尝试编写一个简单的代码来在 .csv 文件上编写一些内容。我写了一个for 循环和一堆fgets() 来从文件中获取数据,但是程序不等待用户输入信息而只是关闭程序。有人知道如何解决吗?

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

#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable : 4996)

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

    int i;
    char nome, tel, email, cpf;
    FILE *f_ptr;
    f_ptr = fopen("3556346.csv", "w+");     
    fprintf(f_ptr, "Nome, CPF, Telefone, E-mail\n");        
    
    for (i = 0; i < 6; i++) {
        printf("Digite o nome: ");
        fgets(&nome, sizeof(nome), stdin);
        printf("Digite o CPF: ");
        fgets(&cpf, sizeof(cpf), stdin);
        printf("Digite o telefone: ");
        fgets(&tel, sizeof(tel), stdin);
        printf("Digite o e-mail: ");
        fgets(&email, sizeof(email), stdin);
        fprintf(f_ptr, "%c, %d, %c, %c\n", nome, cpf, tel, email);
    }       
    fclose(f_ptr);

    return 0;
}

P.S.:如果有人来这里遇到和我一样的问题。解决方案,就像下面的好人指出的那样,将[101] 放在每个char 声明的名称之后。像字符 nome[101], tel[101], ... 同样在fprintf 命令中,您应该使用%s 而不是%c。我发现的最后一件事,fgets 存储了一个断行,所以如果你不想要它,你需要在每个fgets 之后写nome[strcspn(nome, "\n")] = '\0';,其中nome 是变量的名称。

【问题讨论】:

  • char nome, tel, email, cpf; 不能保存任何字符串。 char nome[100] 可以。 (最多99 个字符加上'\0' nul 终止字符)然后fgets (nome, sizeof nome, stdin);
  • 还要注意#define _CRT_SECURE_NO_WARNINGS#pragma warning(disable : 4996)做同样的事情,禁用警告4996
  • 感谢您的 cmets 大卫。我尝试使用 #define _CRT_SECURE_NO_WARNINGs 但它不起作用,这就是我尝试另一个的原因。但现在我只是使用 pragma 并且它工作正常。您对尺寸的输入就是我解决问题所需要的!再次感谢
  • 很高兴它有帮助。 #define#pragma 的问题很奇怪,它们都应该做完全相同的事情,请参阅 Security Features in the CRT 尽管 VS 的行为从未停止让我感到惊讶 :)

标签: c csv input printf fgets


【解决方案1】:

fgets() 函数最多从给定流中读取比 size 指定的字符数少 1 的字符,并将它们存储在字符串 str 中。

由于您的所有变量都是单个字符,因此您要求 fgets 提供单个字节。它少读一个,为终止的 mull 字节留出空间,该字节为零。

fgets 读取 字符串 而不是字符。您需要将其存储在字符串中,而不是字符中。如果您只想存储一个字符,请分配两个字节。一个用于字符,一个用于终止空字节。

char nome[2];
fgets(nome, sizeof(nome), stdin);

但我怀疑您要存储多个字符。你必须分配足够的内存,再加上一个。

// enough memory for 100 characters, pus the terminating null byte.
char nome[101];
fgets(nome, sizeof(nome), stdin);

或者,更好的是,分配一个大缓冲区并将其复制到适当大小的内存中。

char line[4096];
printf("Digite o nome: ");
fgets(line, sizeof(line), stdin);
char *nome = strdup(line);

printf("Digite o CPF: ");
fgets(line, sizeof(line), stdin);
char *cpf = strdup(cpf);

【讨论】:

  • 感谢您的回答。您的代码仍然出错,但感谢您的输入,我能够更正我的代码。我为每个字符声明了一个大小,并在 fprint 命令中使用了 %s 而不是 %c。
  • @SamuelPereira 正确。 %c 用于单个 char%s 用于“字符串”,它是一个以空字符结尾的字符数组。
猜你喜欢
  • 2016-05-06
  • 1970-01-01
  • 1970-01-01
  • 2017-03-13
  • 2012-06-12
  • 1970-01-01
  • 1970-01-01
  • 2018-04-01
相关资源
最近更新 更多