我有这段代码应该要求用户输入一些信息:
char * nome = malloc(256);
char * cc = malloc(256);
char * morada = malloc(256);
char * tlf = malloc(20);
printf("Novo nome:");
gets_s(nome, sizeof(nome));
printf("Nova Morada:");
fflush(stdin);
gets_s(morada, sizeof(morada));
printf("Cartao de cidadao:");
fflush(stdin);
gets_s(cc, sizeof(cc));
printf("Novo Contacto:");
fflush(stdin);
gets_s(tlf, sizeof(tlf));
第一次gets_s()
获取被忽略,我无法理解原因,我也尝试使用scanf("%s",nome)
并尝试使用某些分辨率I&#39 ;通过堆栈溢出找到了,因为据我所知,scanf()
发生的事情是实际读取的最后一个字符"自动"因为它没有在之前的scanf()
消费,但我不认为是这种情况,因为我已经尝试了我能找到的每一个建议。
任何人都可以解释为什么会发生这种情况吗?
编辑:
char nome[256];
char cc[256];
char morada[256];
char tlf[20];
printf("Novo nome:");
fflush(stdin);
scanf("%s", nome);
printf("Nova Morada:");
fflush(stdin);
scanf("%s", morada);
printf("Cartao de cidadao:");
fflush(stdin);
scanf("%s", cc);
printf("Novo Contacto:");
fflush(stdin);
scanf("%s", tlf);
答案 0 :(得分:0)
当您想要读取包含空格的字符串时,使用fgets()
比使用scanf()
更容易。另请注意,根据标准,fflush(stdin)
会导致未定义的行为,尽管Microsoft支持此用法的已定义行为。不过,它不可移植,可能永远不应该使用。
当您使用fgets()
读取输入行时,尾随换行符存储在输入缓冲区中,因此您可能需要将其删除。有很多方法可以做到这一点,但是在这里我使用strchr()
中的string.h
函数来编写一个小函数eat_newline()
,它找到换行符并用空字符替换它。
使用fgets()
的一个优点虽然在这里没有使用,但是你可以读入一行输入,然后使用sscanf()
来解析它,就像使用scanf()
一样。你会使用#include <stdio.h>
#include <string.h>
void eat_newline(char *str)
{
char *find;
if ((find = strchr(str, '\n')) != NULL) {
*find = '\0';
}
}
int main(void)
{
char nome[256];
char cc[256];
char morada[256];
char tlf[20];
printf("Novo nome:");
fgets(nome, sizeof nome, stdin);
eat_newline(nome);
printf("Nova Morada:");
fgets(morada, sizeof morada, stdin);
eat_newline(morada);
printf("Cartao de cidadao:");
fgets(cc, sizeof cc, stdin);
eat_newline(cc);
printf("Novo Contacto:");
fgets(tlf, sizeof tlf, stdin);
eat_newline(tlf);
printf("nome: %s\n", nome);
printf("morada: %s\n", morada);
printf("cc: %s\n", cc);
printf("tlf: %s\n", tlf);
return 0;
}
,但有更多的控制权,并能够重新扫描同一行输入。
stream create test-stream --definition "file | enricher | log" --deploy