我有一个这段代码,我想知道为什么我的代码会跳过scanf ...
#include <stdio.h>
char nombre[20];
int tipo;
int edad;
int dias;
int repetir=0;
int main()
{
while (repetir==0){
int error=0;
do{
printf("Diga su Nombre: ");
scanf("%19[^\n]", nombre);
printf("Diga el tipo de Sala: ");
scanf("%d", & tipo);
printf("Diga la edad del Paciente: ");
scanf("%d", & edad);
printf("Dias de Hospitalizacion: ");
scanf("%d", & dias);
if ((tipo>4) || (tipo<0) || (edad<0) || (dias <0) ){
printf("Eror al ingresar los datos");
} else {
error = 1;
}
}
while(error==0);
printf("¿Algun otro paciente? SI=0 NO=1");
scanf("%d", &repetir);
}
return(0);
}
它只是一个简单的代码,但是当我运行代码时出现如下代码:
Diga su Nombre: (Name with spaces)
Diga el Tipo de Sala (Integer Number)
Diga la edad del Paciente (Integer Number)
Dias de Hospitalizacion (Integer Number)
//Check For errors
¿Algun otro paciente? SI=0 NO=1 (Pressing 0 To repeat)
//Repeat
Diga su Nombre: Diga el Tipo de Sala
....
....
代码不再向我询问字符串Data,我真的不知道在这种情况下我必须做什么...... Ty非常感谢你的帮助!
这就是我尝试的......但只是冻结了
// .....
scanf("%d", & dias);
//Dont really know what to do here :S
int c; while ( (c = getchar()) == '\n' && c != EOF ) { }
if ((tipo>4) || (tipo<0) || (edad<0) || (dias <0) ){
答案 0 :(得分:5)
在main()
内,行char nombre[]= {0};
声明了一个大小为1
的数组。然后使用scanf
读入它,这会溢出缓冲区,导致未定义的行为。
数组不会在C中自动增长,它们具有固定的大小,您在定义它们时必须分配它们。 (由于您将大小留空,因此通过计算初始化程序的数量来计算大小)。
修复示例:
char nombre[50];
// ...
scanf("%49[^\n]%*c", nombre);
NB。全局变量char nombre[];
是与main
的{{1}}不同的变量,您当前没有使用它,所以我建议删除其中一个(并给出其余的变量)一个像nombre
)这样的大小。
如果您不止一次执行此循环,还有另一个问题。当您使用50
...时,它会提取整数的字符,但它也不会提取换行符。所以下次来scanf("%d"
时,它会在那里读取换行符。
要解决此问题,您需要在循环结束时手动使用换行符,例如
scanf("%[
可能也会在scanf("%d", &repetir);
while ( getchar() != '\n' ) { }
之后执行此操作。从技术上讲,它应该是scanf("%d", & dias);
但是在交互式程序中不是问题。
此外,int c; while ( (c = getchar()) != '\n' && c != EOF ) { }
是多余的,您可以将其设为%*c
。为了正确,此时你也可以丢弃剩余的线。
答案 1 :(得分:-1)
要将nombre
作为字符串(char数组),请将scanf语句替换为:
scanf("%s", nombre);