2017-02-20 145 views
-2

我有这段代码是应该要求用户输入一些信息:gets_s()是越来越跳过

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),并试图用户通过堆栈溢出发现一些解决方案,因为据我了解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); 
+5

1)'fflush(stdin);'调用未定义的行为2)您不检查'malloc'和'gets_s'的任何结果。 3)边界检查接口是可选的。为什么不使用'fgets'? 4)指针不是数组。 5)获取你的C书并阅读'sizeof'的功能。 – Olaf

+0

我感谢您的评论。首先你说“调用未定义的行为”是什么意思? 我已经按照你的建议使用了fgets(),但结果是一样的,我抛弃了fflush(),因为我从你的评论中了解到它的行为没有定义,因此它不清楚缓冲区。 仍然得到相同的结果 – LikeIfYouCaredAboutMyName

+2

你最大的问题是以不恰当的方式使用'sizeof'。 – DyZ

回答

0

它更容易使用fgets()scanf()当你想读取包含空格的字符串。另请注意,根据标准,fflush(stdin)导致未定义的行为,但Microsoft支持此用法的定义行为。不过,这是不是便携式,可能永远不应该使用。

当您使用fgets()读取一行输入时,尾随换行符存储在输入缓冲区中,因此您可能需要将其删除。有很多方法可以做到这一点,但在这里我使用string.h中的strchr()函数来编写一个小函数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; 
} 
+1

这是这是迄今为止最好的答案,也是最能解决我问题的答案。谢谢你的详细解答和例子,先生 – LikeIfYouCaredAboutMyName