fgets 不等待用户在我的 C 代码中输入
fgets doesn't wait for user input in my C code
我正在尝试做一个简单的代码来在 .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
声明的名称之后。比如 char nome[101]
, tel[101]
, ...
同样在 fprintf
命令中,您应该使用 %s
而不是 %c
。我发现的最后一件事是,fgets
存储了一个换行符,所以如果你不想要它,你需要在每个 fgets
之后写 nome[strcspn(nome, "\n")] = '[=21=]';
,其中 nome
是变量的名称。
The fgets() function reads at most one less than the number of characters specified by size from the given stream and stores them in the string 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);
我正在尝试做一个简单的代码来在 .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
声明的名称之后。比如 char nome[101]
, tel[101]
, ...
同样在 fprintf
命令中,您应该使用 %s
而不是 %c
。我发现的最后一件事是,fgets
存储了一个换行符,所以如果你不想要它,你需要在每个 fgets
之后写 nome[strcspn(nome, "\n")] = '[=21=]';
,其中 nome
是变量的名称。
The fgets() function reads at most one less than the number of characters specified by size from the given stream and stores them in the string 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);