【发布时间】:2017-02-20 19:52:25
【问题描述】:
我有这段代码应该要求用户输入一些信息:
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);
【问题讨论】:
-
1)
fflush(stdin);调用未定义的行为 2) 您没有检查malloc和gets_s的任何结果。 3) 边界检查接口是可选的。为什么不使用fgets? 4) 指针不是数组。 5) 拿起你的 C 书,看看sizeof做了什么。 -
感谢您的评论。首先,“调用未定义的行为”是什么意思?我已经按照你的建议使用了 fgets() 但结果是一样的,我已经放弃了 fflush() 因为我从你的评论中了解到它的行为没有定义,因此不确定它是否会清理缓冲区。仍然得到相同的结果
-
您最大的问题是不恰当地使用
sizeof。 -
在此之前有没有读取输入的代码?如果您将
gets_s()和scanf()混合使用,则必须小心。 -
sizeof(nome)可能只是4,因为它是指针的大小,而不是它指向的缓冲区的大小。