【问题标题】:Printing an array when not every cell is filled当不是每个单元格都被填充时打印一个数组
【发布时间】:2014-03-01 22:10:56
【问题描述】:

我正在尝试用至少 12 个双精度数填充一个数组,然后打印数组中的双精度数。如果我正好使用 12 个双打,这很好,但如果我使用少于 12 个双打,程序将不会继续,直到我输入 12。代码如下所示:

#include<stdio.h>
#include<string>
int main(){
    double arr[12];
    printf("Enter Numbers\n");
    for(int i=0;i<12;i++){
        scanf_s("%lf",&arr[i]);
    }
    for(int i=0;i<12;i++){
        printf("%f\n",arr[i]);
    }
    return 0;
}

我是否可以做一个简单的更改,例如,如果我输入数字 1 13 52 或数字 8 99 11 45 82,它会将它们打印回给我?我不担心超过 12 个,也不关心阵列中浪费的内存单元。

【问题讨论】:

  • 您应该注意添加超过 12 个,因为这将导致未定义的行为

标签: c arrays dynamic


【解决方案1】:

为此,您必须有一些退出条件。例如,当您输入负数时,您可以停止

int n = 12;
for(int i=0;i<12;i++){
    scanf_s("%lf",&arr[i]);
    if (arr[i] < 0) {
        n = i;
        break;
    }
}

for(int i=0;i<n;i++){
    printf("%f\n",arr[i]);
}

或其他一些条件,例如输入零或一些大的负数。

更新:

如果你想在没有更多数字时停止,你可以按照@leeduhem的建议检查scanf_s的返回值

int n = 12;
for(int i=0;i<12;i++){
    int rc = scanf_s("%lf",&arr[i]);
    if (rc == 0 || rc == EOF) {
        n = i;
        break;
    }
}

【讨论】:

  • 这是有道理的,但我想我需要在它完成读取我输入的双打时打破它,即使我没有输入 12 个双打。有没有办法做到这一点?
  • 如果你想输入12个数字,你可以省略break语句。这将标记负数位置并仍然读取所有 12 个双精度数。但是,您还必须确保没有其他负数。否则,n 将指向第二个或第三个。
  • @user3342994 是,break 如果scanf_s(..) 返回EOF
  • 好吧,我一点也不担心负数。比如说我输入“1 2 3 4 5”。在继续之前,循环将等待我再输入 7 个双打。我不希望它那样做。我只希望它填充 arr[0]=1 arr[1]=2 arr[2]=3 arr[3]=4 arr[4]=5,并将其余单元格留空,然后打印数组的内容。
  • @leeduhem,你的答案似乎是我正在寻找的,但实现它的代码是什么?
【解决方案2】:

试试这个:

#include<stdio.h>

int main(){
    int n;
    double arr[12];
    printf("Enter Numbers: \n");

    n = 0;
    while (scanf(" %lf", &arr[n++]) != EOF && n < 12)
        ;

    for(int i=0;i<n-1;i++){
        printf("%f\n",arr[i]);
    }
    return 0;
}

运行(仅在 Linux 上测试):

$ ./a.out 
Enter Numbers: 
1 2 3
<=============== Ctr-D on Unix-like, Ctrl-Z on Windows
1.000000
2.000000
3.000000
$ ./a.out 
Enter Numbers: 
1 2 3
4 5 6
<=============== Ctr-D on Unix-like, Ctrl-Z on Windows
1.000000
2.000000
3.000000
4.000000
5.000000
6.000000

【讨论】:

  • 我完全尝试了您发布的内容,但仍然遇到同样的问题。由于某种原因,我必须准确输入 12 个双打才能继续。此外,当我按照你的方式进行操作时,控制台只打印了我输入的前 11 个双打。
  • @user3342994 只打印前 11 个双精度数,因为在那之后 while 循环,n 假设是 13,我使用 for (...; i &lt; n - 1; ...)。但在你的情况下,在while 之后,n 的值是 12。
  • @user3342994 你如何输入你的数据?您是否尝试过我的输入数据,例如'1 2 3', , .
  • 好的,当我在输入数据后尝试 Ctrl-Z 时,它会打印我输入的数字,但随后会打印几行长的随机数字。另外,有没有办法在没有 ctrl-z 的情况下做到这一点?
  • @user3342994 额外的随机数?不知何故,n 再次获得了错误的值。如果没有 Ctrl-Z 或 Ctrl-D,你将如何指示输入的结束?
猜你喜欢
  • 2020-12-04
  • 1970-01-01
  • 1970-01-01
  • 2011-03-18
  • 1970-01-01
  • 1970-01-01
  • 2018-06-13
  • 1970-01-01
  • 2013-07-22
相关资源
最近更新 更多