[英]C: Loop only prints the last index
我是 C 的新手,所以请原谅我问了一个看似简单的问题。 但是我有一个根据用户循环的循环,并且在循环内它要求输入姓名和年龄,但是当我打印 go 时,它只打印最后一个条目,而不是我想要的所有条目。
#include <stdio.h>
int main()
{
int size,age;
char name [30];
printf("How long to loop for: ");
scanf("%d", &size);
for (int i=0; i<size; i++)
{
printf("Enter first name: ");
scanf("%s", name);
printf("Enter %s's age: ",name);
scanf("%d",&age);
printf("name: %s, age: %d\n", name,age);
}
return 0;
}
现在你的name
和age
变量将只保存他们收到的最后一个输入,这就是为什么你的程序只打印最后一个索引。 您需要一个int
数组和一个char []
数组来“保存”他们收到的每个输入,否则这些输入会丢失,您只能获得最后一个索引的输入。
你的变量应该被初始化为:
int size;
printf("Enter size: ");
scanf("%d", &size);
int age [size];
char name[size][30];
为了获取用户输入并打印每个条目,您需要通过遍历数组大小来访问每个索引。
访问每个索引:
age[i]
name[i]
请注意:使用scanf
从用户输入中获取字符串通常是不好的,因为如果您在输入中碰巧使用空格(例如输入您的全名)可能会导致问题,并且可能会导致缓冲区溢出您的字符串比缓冲区长。 相反,您可以使用fgets
,但对于您的问题,这不是必需的,只是将来要考虑的事情,以防您想在输入中有空格。
scanf
实际上读取了一个数字。您希望检查以下内容
if (scanf(" %d", &size) != 1) { // Note space - Eats white space/new lines
printf("Error - invalid size\nExiting\n");
return -1;
}
利用:
scanf(" %29s", name); // See above
我认为这将解决您的问题
好的,如果我对您的理解正确,您将循环遍历 for 循环大小的次数,并且每次设置变量年龄和名称的内容时。 听起来您希望循环中的每次迭代都保存您输入的年龄和姓名实例,但事实并非如此。
由于您只有一个年龄和一个名称变量,因此它们将存储最近输入的任何内容。 所以这意味着在最后一个循环中输入的内容就是最后写入变量名称和年龄的内容。
如果您随后尝试打印这些变量的内容,您将看到最近输入到这些变量中的内容。 如果您尝试保存多个条目,则需要写入多个名称和多个年龄变量。
好的,Anthony,在分配 memory 时,您可能需要尝试一些回顾。 所以当我们声明变量int age时; 我们告诉编译器分配足够的 memory 来存储一个 integer,我们将在我们的程序中称为“年龄”。 由于我们只要求足够的 memory 来存储一个 integer,因此每次您将 scanf() 写入年龄变量时,都会将单个 integer 写入该空间。
您想要的是每次通过 for 循环再次运行时存储一个新的 integer 。 因此,您可以如下声明一个整数数组。
整数年龄[20];
现在我们已经要求编译器分配足够的空间来存储 20 个不同的整数。 在 position 年龄[0] 中会有一个 integer 和另一个在年龄[1] 中的 integer 和另一个在年龄[2] 中。 所以现在你可以使用一个循环来索引你的数组并将每个输入的年龄从标准输入存储到数组中的不同 position 中,如下所示
for(int i=0; i<20; i++)
{
printf("Please enter your age: ");
scanf("%i", &age[i]);
}
所以这个循环从 i=0 开始,所以输入从标准输入到 age[0],循环的下一次迭代有 i=1,所以输入到 age[1] 的标准输入,依此类推。
希望这能更清楚地说明问题吗?
一个主要错误是您的printf
不会在缓冲时显示。
你需要fflush
在他们后面
IE
printf("How long to loop for: ");
fflush(stdout);
和
printf("Enter first name: ");
fflush(stdout);
ETC...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.