【问题标题】:i++ not working inside a while loopi++ 不在 while 循环内工作
【发布时间】:2016-06-07 18:44:11
【问题描述】:

我正在帮助一位朋友上她的编程课,我们遇到了一些有趣的事情。我们有代码:

void ingresardatos(struct alumno *lista){
int i=0;
char continuar='s';
while(continuar=='s' && i<20){
    printf("Valor de i al iniciar: %d  \n", i);
    printf("Introduzca el nombre del alumno:\n");
    scanf("%s",&(lista[i].nombre));
    printf("Introduzca la matricula:\n");
    scanf("%s",&lista[i].matricula);
    printf("Introduzca la primera calificacion:\n");
    scanf("%f",&lista[i].calf1);
    printf("Introduzca la segunda calificacion:\n");
    scanf("%f",&lista[i].calf2);
    printf("Introduzca la tercera caificacion:\n");
    scanf("%f",&lista[i].calf3);

    lista[i].prom=(lista[i].calf1+lista[i].calf2+lista[i].calf3)/3;

    if(lista[i].prom<=5.9){
       strcpy(lista[i].nota,"NA");
    }
    else if(lista[i].prom>=6 && lista[i].prom<=7.3){
       strcpy(lista[i].nota,"S");
    }
    else if(lista[i].prom>=7.4 && lista[i].prom<=8.6){
      strcpy(lista[i].nota,"B");
    }
    else if(lista[i].prom>=8.7 && lista[i].prom<=10){
       strcpy(lista[i].nota,"MB");
    }
    printf("Valor de i antes: %d \n", i);
    i++;
    printf("Valor de i después: %d \n", i);
    printf("¿Desea continuar? (S/N)");
    scanf("%s",&continuar);
}
}

这应该是一个 20 人班级的成绩单;您介绍学生的数据,直到您按“n”,然后将它们保存在列表中。现在,我弄清楚了指针部分(我真的很了解 Java,所以在 C 上工作有点奇怪),但我不知道如何使 i++ 部分工作。如果您按原样运行它,它将在第一遍以i=0 开始,然后遍历所有代码,最后在询问您是否要继续之前执行i++(它会在屏幕上打印)。但是,当你按“s”表示你想继续时,它会再次以i=0 开头,而我这辈子都不知道为什么。我尝试了i++++ii=i+1 等等,但似乎没有任何效果。我什至尝试将 i 设为指针,但 Windows 不喜欢它,并且每次运行我的程序都会崩溃。

如果有人能解释为什么它不起作用,我将永远感激不尽。

【问题讨论】:

  • scanf("%s",&amp;continuar); - continuar 是单个 char 类型。它将破坏系统,因为该地址处的字符串输入将至少包含 2 个字符。
  • 解释未定义的行为之后发生的事情并不是真的有效,但假设可以令人满意。 可能是,因为i 就在堆栈上的continuar 上方,所以当您输入字符串 的数据时,'s' 转到char continuar 并且字符串终止符'\0' 转到little-endian 变量i 的最低有效字节。由于您接受输入之前增加了i,因此可能0覆盖了i的最小sig字节,将其值限制为0和导致你看到的行为。 如果.

标签: c counter


【解决方案1】:
scanf("%s",&continuar);

这应该是:

scanf("%c",&continuar);

当您读入单个字符而不是字符串时。

使用scanf("%s",它不仅会写入continuar,还会写入它周围的内存(多少取决于读取的字符数),所以你的i变量必须在它旁边并被覆盖回0.

编辑:

根据@WeatherVane 的评论,solution 实际上应该是:

scanf(" %c",&continuar);

自从您上次读取浮点数后,换行符(从您按回车键开始)仍未读取,并将被放入字符中。

【讨论】:

  • 不,应该是scanf(" %c",&amp;continuar); 加上空格。否则它将读取scanf("%f",&amp;lista[i].calf3);之后留在输入缓冲区中的newline
猜你喜欢
  • 2016-01-11
  • 1970-01-01
  • 1970-01-01
  • 2016-04-24
  • 2013-05-03
  • 2016-04-20
  • 2011-08-12
  • 2016-12-05
  • 1970-01-01
相关资源
最近更新 更多