gpt4 book ai didi

c - 当用户在 c 中完成输入时停止 for 循环

转载 作者:太空狗 更新时间:2023-10-29 16:10:51 26 4
gpt4 key购买 nike

首先感谢您的协助!

我是 C 语言(和一般编程)的新手,我正在尝试编写一个用户输入数据点的程序。然后将数据点保存在一个数组中,然后可以在其中对其进行操作。

我被困在哪里:我希望用户能够输入(几乎)任意数量的点,然后使用各种“关键字”来表示数据输入结束。在这种情况下,用户将键入“完成”。

这是我目前所拥有的:

#include <stdio.h>
#include <string.h>

int main(void) {

printf("\n Welcome! \n\n Please enter each data point. Enter 'done' when finished.\n\n");

double data[1048];
int i, count;

for (i = 1; ;i++) {

printf("Data[%i]: ", i);
scanf("%lf", &data[i]);

if (data[i] == 'done') {

break;

} else {

count++;

}

}

}

我试过“返回 1;”和“休息”。每次,该程序都运行良好,直到输入“关键字”,此时我得到:

Data[8]: Data[9]: ... Data[1120]: Data[1Segmentation fault 11 

它唯一起作用的情况是当用户输入特定数字(如 -1 或 0)时它会中断。但这对用户来说不太适用,因为他们可能必须输入这些数字作为数据点。

抱歉发了这么长的帖子,但感谢您的帮助!

最佳答案

您的问题已经收到了很多很好的答案,还有更多方法可以输入 doubles并停在 "done" .由于您正在学习 C,因此始终始终(以防万一不清楚),检查 scanf 的返回值验证您预期实际发生的转化次数。[1](这也为您提供了在 "done" 上结束输入的方式(或任何非双重输入导致 scanf 返回小于 1 )

如评论中所述,C 中的数组从零开始。当您进行输入时,您需要使用 count作为你的数组索引,而不是 i (在这种情况下,如果您在每次失败时退出读取——没关系,但您可以很容易地再次提示额外的输入并增加 count 仅在从 scanf 成功返回时)回到您的问题.如果您将读取循环设置为不断循环,直到出现 scanf。失败,您可以使用一个临时变量来最初捕获输入值,并且只将该值分配给您的数组并在成功时增加您的索引。例如(有一个常量 MAXD = 1048 )

for (;;) {  /* loop until scanf input fails (with 'done') */

double tmp; /* block scope declarations are fine */

printf (" data[%4d]: ", count);

if (count < MAXD && scanf(" %lf", &tmp) == 1)
data[count++] = tmp;
else
break;
}

(您甚至可以将提示的副本移动到循环上方,并将提示的副本移动到 if (....) {...} 之后,以在达到数组限制 (MAXD) 时消除提示——留作练习)

在上面的示例中,您在存储值之前执行了 2 个条件。 (1) 您将用户可以存储的值的数量限制为 MAXD ,以及 (2) 如果有效转换为 double,您只存储一个值发生在 scanf .如果任一条件失败,您将离开循环(如果您输入 "done" 作为 double 值,它会)。

将各个部分放在一起并在评论中添加一些额外的提示,您可以使用如下内容进行测试:

#include <stdio.h>

enum { MAXD = 1048 }; /* declare constants instead of using magic numbers */

int main (void) {

double data[MAXD] = {0}; /* in ISO C declarations come before code */
int i, count = 0; /* initializing variable saves debug time */

printf ("\n Welcome! \n\n Please enter each data point. "
"Enter 'done' when finished.\n\n");

for (;;) { /* loop until scanf input fails (with 'done') */

double tmp; /* block scope declarations are fine */

printf (" data[%4d]: ", count);

if (count < MAXD && scanf(" %lf", &tmp) == 1)
data[count++] = tmp;
else
break;
}

printf ("\n %d values entered:\n\n", count);

for (i = 0; i < count; i++)
printf (" data[%4d] : %.2lf\n", i, data[i]);

return 0; /* main() is type 'int' and returns a value */
}

示例使用/输出

$ ./bin/scanfdoubles

Welcome!

Please enter each data point. Enter 'done' when finished.

data[ 0]: 1.1
data[ 1]: 1.2
data[ 2]: 1.3
data[ 3]: 1.4
data[ 4]: 1.5
data[ 5]: 1.6
data[ 6]: done

6 values entered:

data[ 0] : 1.10
data[ 1] : 1.20
data[ 2] : 1.30
data[ 3] : 1.40
data[ 4] : 1.50
data[ 5] : 1.60

检查一下,如果您有任何问题,请告诉我。

脚注:

1. 而您可以使用scanf要在 C 中获取用户输入,最好使用 line-oriented 函数(如 fgets ),然后解析完整的行(例如 sscanf )。这允许您 (1) 验证读取(例如 fgets 的返回),然后 (2) 单独验证用户输入的值。这种读取和解析的解耦有很多优点。

关于c - 当用户在 c 中完成输入时停止 for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39071321/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com