Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中的循环出错了_C_Arrays_Loops_Variables - Fatal编程技术网

C中的循环出错了

C中的循环出错了,c,arrays,loops,variables,C,Arrays,Loops,Variables,我有这个密码 for (i = 0; i < s; i++) // for i from 0 to Runners { for (j = 0; j < 4; j++) //for j from 0 to laps { printf("\nEnter the time of lap %d for runner %d in minutes: ", j+1, i+1); // prompt for time for each runner in minute

我有这个密码

for (i = 0; i < s; i++) // for i from 0 to Runners
{
    for (j = 0; j < 4; j++) //for j from 0 to laps
    {
        printf("\nEnter the time of lap %d for runner %d in minutes: ", j+1, i+1); // prompt for time for each runner in minutes
        while (scanf("%d", &Runnerm[i][j]) != 1) // While scanf returns not equal to 1 (value parsed == TRUE)
        {
            while ((ch = getchar()) != '\n') putchar(ch); // check if ch=character, compare last entry (\n if character)
            printf(" is not an integer.\nPlease enter only an "); // print error
            printf("integer, such as 1, 5, or 9 : \n"); // cnt print error
        }

        printf("Enter the time of lap %d for runner %d in seconds: ", j+1, i+1); //prompt for time for each runner in seconds
        while (scanf("%d", &Runners[i][j]) != 1) // While scanf returns not equal to 1 (value parsed == TRUE)
        {
            while ((ch = getchar()) != '\n') putchar(ch); // check if ch=character, compare last entry (\n if character)
            printf(" is not an integer.\nPlease enter only an "); // print error
            printf("integer, such as 1, 5, or 9 : \n"); // cnt print error
        }

        printf(" \n check 1 \n ");
        printf("\n %d minutes -- %d seconds \n", Runnerm[i][j], Runners[i][j]); // Correct Check!

        printf(" \n check 1.5 \n ");
        printf("\n %d minutes -- %d seconds \n", Runnerm[i][0], Runners[i][0]); // Incorrect Check!
        printf("\n %d minutes -- %d seconds \n", Runnerm[i][1], Runners[i][1]); // Incorrect Check!
        printf("\n %d minutes -- %d seconds \n", Runnerm[i][2], Runners[i][2]); // Incorrect Check!
        printf("\n %d minutes -- %d seconds \n", Runnerm[i][3], Runners[i][3]); // Incorrect Check!

    }
}
(i=0;ifor//i从0到 { 对于(j=0;j<4;j++)//对于从0到圈的j { printf(“\n以分钟为单位输入跑步者%d圈的时间:”,j+1,i+1);//以分钟为单位提示每个跑步者的时间 while(scanf(“%d”,&Runnerm[i][j])!=1)//而scanf返回的值不等于1(解析后的值==TRUE) { while((ch=getchar())!='\n')putchar(ch);//检查ch=character,比较最后一个条目(\n如果character) printf(“不是整数。\n请只输入一个”);//打印错误 printf(“整数,如1、5或9:\n”);//cnt打印错误 } printf(“以秒为单位输入跑步者%d圈的时间:”,j+1,i+1);//以秒为单位提示每个跑步者的时间 while(scanf(“%d”,&Runners[i][j])!=1)//而scanf返回的值不等于1(解析后的值==TRUE) { while((ch=getchar())!='\n')putchar(ch);//检查ch=character,比较最后一个条目(\n如果character) printf(“不是整数。\n请只输入一个”);//打印错误 printf(“整数,如1、5或9:\n”);//cnt打印错误 } printf(“\n检查1\n”); printf(“\n%d分钟--%d秒\n”,Runnerm[i][j],Runnerm[i][j]);//检查正确! printf(“\n检查1.5\n”); printf(“\n%d分钟--%d秒\n”,Runnerm[i][0],Runnerm[i][0]);//检查不正确! printf(“\n%d分钟--%d秒\n”,Runnerm[i][1],Runnerm[i][1]);//检查不正确! printf(“\n%d分钟--%d秒\n”,Runnerm[i][2],Runnerm[i][2]);//检查不正确! printf(“\n%d分钟--%d秒\n”,Runnerm[i][3],Runnerm[i][3]);//检查不正确! } } 问题是,当check 1.5第二次运行时,
Runnerm[i][j]
runner[i+1][j]

简而言之,当我更改值时,
Runnerm
的先前存储值将获得当前存储的运行程序的值

为什么呢?我找不到原因

编辑:存在“检查1”和“检查1.5”的全部目的是检查循环任何给定时间的值。因此,即使我删除它们,程序仍然会被破坏。 此外,当这一切都修复后,检查将被删除,因为我将不再需要检查值。谢谢大家的回答,但我不明白你们为什么建议对这些检查做些什么,它们是用来调试的\

Edit找到了问题的原因,当我使用使用较少数组的程序的另一个版本时,问题得到了解决,当我开始添加随机未使用的数组时,问题出现了。 为什么呢?(新问题)
是否内存与跑步者[i][j]使用的内存重叠?

您的
printf
语句显示的是下一个跑步者/下一次,但记录的是跑步者/下一次:

printf("\nEnter the time of lap %d for runner %d in minutes: ", j+1, i+1);
                                                                ^^^^ ^^^^

为什么不
i
j

您的
printf
语句似乎正在显示下一个跑步者/下一次,但正在记录之前的跑步者/时间:

printf("\nEnter the time of lap %d for runner %d in minutes: ", j+1, i+1);
                                                                ^^^^ ^^^^

为什么不移动这些代码行呢

printf(" \n check 1.5 \n ");
printf("\n %d minutes -- %d seconds \n", Runnerm[i][0], Runners[i][0]);
printf("\n %d minutes -- %d seconds \n", Runnerm[i][1], Runners[i][1]);
printf("\n %d minutes -- %d seconds \n", Runnerm[i][2], Runners[i][2]);
printf("\n %d minutes -- %d seconds \n", Runnerm[i][3], Runners[i][3]);
要在
j
循环之外,请删除冗余提示,并删除用作循环边界的神奇常量

#define RUNNERS s
#define LAPS 4

for (i = 0; i < RUNNERS; i++)
{
    for (j = 0; j < LAPS; j++)
    {
        printf("Enter the time of lap %d for runner %d in seconds: ", j+1, i+1)
        while (scanf("%d", &Runners[i][j]) != 1)
        {
            while ((ch = getchar()) != '\n') putchar(ch);
            printf(" is not an integer.\nPlease enter only an integer, such as 1, 5, or 9 : \n");
        }

        printf(" \n check 1 \n ");
        printf("\n %d minutes -- %d seconds \n", Runnerm[i][j], Runners[i][j]);

    }

    printf(" \n check 1.5 \n ");

    for (j = 0; j < LAPS; j++)
        printf("\n %d minutes -- %d seconds \n", Runnerm[i][j], Runners[i][j]);
}
#定义跑步者
#定义第4圈
对于(i=0;i<0;i++)
{
对于(j=0;j

尽管就个人而言,我认为非功能性是您的问题中最小的一个:您的代码被过度压缩和浸泡,并且您的输出中有太多的换行符。

移动这些代码行:

printf(" \n check 1.5 \n ");
printf("\n %d minutes -- %d seconds \n", Runnerm[i][0], Runners[i][0]);
printf("\n %d minutes -- %d seconds \n", Runnerm[i][1], Runners[i][1]);
printf("\n %d minutes -- %d seconds \n", Runnerm[i][2], Runners[i][2]);
printf("\n %d minutes -- %d seconds \n", Runnerm[i][3], Runners[i][3]);
要在
j
循环之外,请删除冗余提示,并删除用作循环边界的神奇常量

#define RUNNERS s
#define LAPS 4

for (i = 0; i < RUNNERS; i++)
{
    for (j = 0; j < LAPS; j++)
    {
        printf("Enter the time of lap %d for runner %d in seconds: ", j+1, i+1)
        while (scanf("%d", &Runners[i][j]) != 1)
        {
            while ((ch = getchar()) != '\n') putchar(ch);
            printf(" is not an integer.\nPlease enter only an integer, such as 1, 5, or 9 : \n");
        }

        printf(" \n check 1 \n ");
        printf("\n %d minutes -- %d seconds \n", Runnerm[i][j], Runners[i][j]);

    }

    printf(" \n check 1.5 \n ");

    for (j = 0; j < LAPS; j++)
        printf("\n %d minutes -- %d seconds \n", Runnerm[i][j], Runners[i][j]);
}
#定义跑步者
#定义第4圈
对于(i=0;i<0;i++)
{
对于(j=0;j

尽管就我个人而言,我认为非功能性是你的问题中最小的:你的代码被过度压缩和浸泡,并且你的输出中有太多的换行符。

将问题代码充实到实际的程序中:

#include <stdio.h>

int main()
  {
  int s = 3;
  int i;
  int j;
  int ch;
  int Runnerm[s][4]; //Runners / minutes
  int Runners[s][4]; //Runners / seconds

  for (i = 0; i < s; i++) // for i from 0 to Runners
     {
     for (j = 0; j < 4; j++) //for j from 0 to laps
        {
        printf("\nEnter the time of lap %d for runner %d in minutes: ", j+1, i+1); // prompt for time for each runner in minutes
        while (scanf("%d", &Runnerm[i][j]) != 1) // While scanf returns not equal to 1 (value parsed == TRUE)
           {
           while ((ch = getchar()) != '\n') putchar(ch); // check if ch=character, compare last entry (\n if character)
           printf(" is not an integer.\nPlease enter only an "); // print error
           printf("integer, such as 1, 5, or 9 : \n"); // cnt print error
           }

        printf("Enter the time of lap %d for runner %d in seconds: ", j+1, i+1); //prompt for time for each runner in seconds
        while (scanf("%d", &Runners[i][j]) != 1) // While scanf returns not equal to 1 (value parsed == TRUE)
           {
           while ((ch = getchar()) != '\n') putchar(ch); // check if ch=character, compare last entry (\n if character)
           printf(" is not an integer.\nPlease enter only an "); // print error
           printf("integer, such as 1, 5, or 9 : \n"); // cnt print error
           }

        printf("check 1 \n ");
        printf("\t %d minutes -- %d seconds \n", Runnerm[i][j], Runners[i][j]); // Correct Check!

        printf("check 1.5 \n ");
        printf("\t %d minutes -- %d seconds \n", Runnerm[i][0], Runners[i][0]); // Incorrect Check!
然后我编译了代码:

SLES11SP2:~/SO> gcc -Wall -o test *.c
然后运行代码:

SLES11SP2:~/SO> ./test

Enter the time of lap 1 for runner 1 in minutes: 1
Enter the time of lap 1 for runner 1 in seconds: 2
check 1
   1 minutes -- 2 seconds
check 1.5
   1 minutes -- 2 seconds

Enter the time of lap 2 for runner 1 in minutes: 3
Enter the time of lap 2 for runner 1 in seconds: 4
check 1
   3 minutes -- 4 seconds
check 1.5
   1 minutes -- 2 seconds
   3 minutes -- 4 seconds

Enter the time of lap 3 for runner 1 in minutes: 5
Enter the time of lap 3 for runner 1 in seconds: 6
check 1
   5 minutes -- 6 seconds
check 1.5
   1 minutes -- 2 seconds
   3 minutes -- 4 seconds
   5 minutes -- 6 seconds

Enter the time of lap 4 for runner 1 in minutes: 7
Enter the time of lap 4 for runner 1 in seconds: 8
check 1
   7 minutes -- 8 seconds
check 1.5
   1 minutes -- 2 seconds
   3 minutes -- 4 seconds
   5 minutes -- 6 seconds
   7 minutes -- 8 seconds

Enter the time of lap 1 for runner 2 in minutes: 9
Enter the time of lap 1 for runner 2 in seconds: 10
check 1
   9 minutes -- 10 seconds
check 1.5
   9 minutes -- 10 seconds

Enter the time of lap 2 for runner 2 in minutes: 11
Enter the time of lap 2 for runner 2 in seconds: 12
check 1
   11 minutes -- 12 seconds
check 1.5
   9 minutes -- 10 seconds
   11 minutes -- 12 seconds

Enter the time of lap 3 for runner 2 in minutes: 13
Enter the time of lap 3 for runner 2 in seconds: 14
check 1
   13 minutes -- 14 seconds
check 1.5
   9 minutes -- 10 seconds
   11 minutes -- 12 seconds
   13 minutes -- 14 seconds

Enter the time of lap 4 for runner 2 in minutes: 15
Enter the time of lap 4 for runner 2 in seconds: 16
check 1
   15 minutes -- 16 seconds
check 1.5
   9 minutes -- 10 seconds
   11 minutes -- 12 seconds
   13 minutes -- 14 seconds
   15 minutes -- 16 seconds

Enter the time of lap 1 for runner 3 in minutes: 17
Enter the time of lap 1 for runner 3 in seconds: 18
check 1
   17 minutes -- 18 seconds
check 1.5
   17 minutes -- 18 seconds

Enter the time of lap 2 for runner 3 in minutes: 19
Enter the time of lap 2 for runner 3 in seconds: 20
check 1
   19 minutes -- 20 seconds
check 1.5
   17 minutes -- 18 seconds
   19 minutes -- 20 seconds

Enter the time of lap 3 for runner 3 in minutes: 21
Enter the time of lap 3 for runner 3 in seconds: 22
check 1
   21 minutes -- 22 seconds
check 1.5
   17 minutes -- 18 seconds
   19 minutes -- 20 seconds
   21 minutes -- 22 seconds

Enter the time of lap 4 for runner 3 in minutes: 23
Enter the time of lap 4 for runner 3 in seconds: 24
check 1
   23 minutes -- 24 seconds
check 1.5
   17 minutes -- 18 seconds
   19 minutes -- 20 seconds
   21 minutes -- 22 seconds
   23 minutes -- 24 seconds
SLES11SP2:~/SO> 

它似乎工作正常。

将问题代码充实到实际程序中:

#include <stdio.h>

int main()
  {
  int s = 3;
  int i;
  int j;
  int ch;
  int Runnerm[s][4]; //Runners / minutes
  int Runners[s][4]; //Runners / seconds

  for (i = 0; i < s; i++) // for i from 0 to Runners
     {
     for (j = 0; j < 4; j++) //for j from 0 to laps
        {
        printf("\nEnter the time of lap %d for runner %d in minutes: ", j+1, i+1); // prompt for time for each runner in minutes
        while (scanf("%d", &Runnerm[i][j]) != 1) // While scanf returns not equal to 1 (value parsed == TRUE)
           {
           while ((ch = getchar()) != '\n') putchar(ch); // check if ch=character, compare last entry (\n if character)
           printf(" is not an integer.\nPlease enter only an "); // print error
           printf("integer, such as 1, 5, or 9 : \n"); // cnt print error
           }

        printf("Enter the time of lap %d for runner %d in seconds: ", j+1, i+1); //prompt for time for each runner in seconds
        while (scanf("%d", &Runners[i][j]) != 1) // While scanf returns not equal to 1 (value parsed == TRUE)
           {
           while ((ch = getchar()) != '\n') putchar(ch); // check if ch=character, compare last entry (\n if character)
           printf(" is not an integer.\nPlease enter only an "); // print error
           printf("integer, such as 1, 5, or 9 : \n"); // cnt print error
           }

        printf("check 1 \n ");
        printf("\t %d minutes -- %d seconds \n", Runnerm[i][j], Runners[i][j]); // Correct Check!

        printf("check 1.5 \n ");
        printf("\t %d minutes -- %d seconds \n", Runnerm[i][0], Runners[i][0]); // Incorrect Check!
然后我编译了代码:

SLES11SP2:~/SO> gcc -Wall -o test *.c
然后运行代码:

SLES11SP2:~/SO> ./test

Enter the time of lap 1 for runner 1 in minutes: 1
Enter the time of lap 1 for runner 1 in seconds: 2
check 1
   1 minutes -- 2 seconds
check 1.5
   1 minutes -- 2 seconds

Enter the time of lap 2 for runner 1 in minutes: 3
Enter the time of lap 2 for runner 1 in seconds: 4
check 1
   3 minutes -- 4 seconds
check 1.5
   1 minutes -- 2 seconds
   3 minutes -- 4 seconds

Enter the time of lap 3 for runner 1 in minutes: 5
Enter the time of lap 3 for runner 1 in seconds: 6
check 1
   5 minutes -- 6 seconds
check 1.5
   1 minutes -- 2 seconds
   3 minutes -- 4 seconds
   5 minutes -- 6 seconds

Enter the time of lap 4 for runner 1 in minutes: 7
Enter the time of lap 4 for runner 1 in seconds: 8
check 1
   7 minutes -- 8 seconds
check 1.5
   1 minutes -- 2 seconds
   3 minutes -- 4 seconds
   5 minutes -- 6 seconds
   7 minutes -- 8 seconds

Enter the time of lap 1 for runner 2 in minutes: 9
Enter the time of lap 1 for runner 2 in seconds: 10
check 1
   9 minutes -- 10 seconds
check 1.5
   9 minutes -- 10 seconds

Enter the time of lap 2 for runner 2 in minutes: 11
Enter the time of lap 2 for runner 2 in seconds: 12
check 1
   11 minutes -- 12 seconds
check 1.5
   9 minutes -- 10 seconds
   11 minutes -- 12 seconds

Enter the time of lap 3 for runner 2 in minutes: 13
Enter the time of lap 3 for runner 2 in seconds: 14
check 1
   13 minutes -- 14 seconds
check 1.5
   9 minutes -- 10 seconds
   11 minutes -- 12 seconds
   13 minutes -- 14 seconds

Enter the time of lap 4 for runner 2 in minutes: 15
Enter the time of lap 4 for runner 2 in seconds: 16
check 1
   15 minutes -- 16 seconds
check 1.5
   9 minutes -- 10 seconds
   11 minutes -- 12 seconds
   13 minutes -- 14 seconds
   15 minutes -- 16 seconds

Enter the time of lap 1 for runner 3 in minutes: 17
Enter the time of lap 1 for runner 3 in seconds: 18
check 1
   17 minutes -- 18 seconds
check 1.5
   17 minutes -- 18 seconds

Enter the time of lap 2 for runner 3 in minutes: 19
Enter the time of lap 2 for runner 3 in seconds: 20
check 1
   19 minutes -- 20 seconds
check 1.5
   17 minutes -- 18 seconds
   19 minutes -- 20 seconds

Enter the time of lap 3 for runner 3 in minutes: 21
Enter the time of lap 3 for runner 3 in seconds: 22
check 1
   21 minutes -- 22 seconds
check 1.5
   17 minutes -- 18 seconds
   19 minutes -- 20 seconds
   21 minutes -- 22 seconds

Enter the time of lap 4 for runner 3 in minutes: 23
Enter the time of lap 4 for runner 3 in seconds: 24
check 1
   23 minutes -- 24 seconds
check 1.5
   17 minutes -- 18 seconds
   19 minutes -- 20 seconds
   21 minutes -- 22 seconds
   23 minutes -- 24 seconds
SLES11SP2:~/SO> 

它似乎工作正常。

数组是如何定义的?int Runnerm[s][4]//跑步者(分钟)[s][4];//跑步者/秒你是说从
检查1
检查1.5
i
会改变值,也就是说,它会增加
1
?你想在
检查1.5
中看到什么?您将输出大量的UNA