在C上避免此错误的正确方法是什么

时间:2014-07-11 01:10:33

标签: c string loops

我有一个这段代码,我想知道为什么我的代码会跳过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) ){

2 个答案:

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