gets_s()被跳过

时间:2017-02-20 19:52:26

标签: c string format scanf

我有这段代码应该要求用户输入一些信息:

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

1 个答案:

答案 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