【问题标题】:What is the correct way to avoid this error on C在 C 上避免此错误的正确方法是什么
【发布时间】:2014-07-11 01:10:32
【问题描述】:

我有这个代码,我想知道为什么我的代码会跳过扫描...

#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
 ....
 ....

代码不再向我询问字符串数据,我真的不知道在这种情况下我必须做什么......非常感谢您的帮助!

更新

这是我尝试过的......但只是冻结

            // .....
            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) ){

【问题讨论】:

  • 字符串的 scanf 被“跳过”,因为从扫描重复代码时起,stdin 流的缓冲区中仍有换行符。添加一个 getchar() 调用来解决这个问题。

标签: c string loops


【解决方案1】:

main() 内部,char nombre[]= {0}; 行声明了一个大小为1 的数组。然后你使用scanf 读取它,这会溢出缓冲区导致未定义的行为。

数组在 C 中不会自动增长,它们有一个固定的大小,你必须在定义它们时指定它。 (由于您将大小留空,它通过计算初始化器的数量来计算大小)。

修复示例:

char nombre[50];
// ...
scanf("%49[^\n]%*c", nombre);

注意。全局变量 char nombre[]; 是与 mainnombre 不同的变量,您目前不使用它,所以我建议删除两者中的一个(并给剩余的一个大小,例如 @ 987654329@)。


还有一个问题,如果你多次执行这个循环。当您使用 scanf("%d"... 时,它会提取整数的字符,但不会提取换行符。所以下次当你来到 scanf("%[... 时,它会在那里读取换行符。

要解决这个问题,您需要在循环结束时手动使用换行符,例如

scanf("%d", &repetir);

while ( getchar() != '\n' ) { }

也可能在scanf("%d", &amp; dias); 之后执行此操作。从技术上讲,它应该是int c; while ( (c = getchar()) != '\n' &amp;&amp; c != EOF ) { },但在交互式程序中这不是问题。

另外,%*c 是多余的,你可以直接改成scanf("%49[^\n]"。正确地说,此时您也可以丢弃该行的其余部分。

【讨论】:

  • 还是一样,我删除了 char nombre[] ={0} var 因为它没用,但代码仍然跳过该字符串上的 scanf...
  • 你是否也修复了第一个char nomber[]的大小?
  • 您使用了错误的尺寸; scanf 中的数字必须比数组的大小小一
  • hmmm 卡在你的 while 上,不知道如何让它工作......它一直循环并关闭我的程序
  • 发布您的代码(作为现有代码的附加 - 不要将其编辑到现有代码中)
【解决方案2】:

要将nombre 作为字符串(char 数组)获取,请将 scanf 语句替换为:

scanf("%s", nombre);

【讨论】:

  • 不能这样做,因为它不会读取空格并且它们是必需的。
  • 对不起。我想我忘了名字可以有空格。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-18
  • 1970-01-01
  • 1970-01-01
  • 2015-09-28
  • 2017-11-10
相关资源
最近更新 更多