【问题标题】:Store data in array from input [duplicate]将输入中的数据存储在数组中[重复]
【发布时间】:2013-07-24 10:14:21
【问题描述】:

我是 C 的初学者。如果我的问题很蹩脚,请不要介意。在我编写的这个程序中,当我第一次使用“for”循环时,我希望只有 3 个值存储在一个数组中,但它存储了 4 个值,并且在下一个“for”循环中按预期显示 3 个值。 我的问题是为什么在第一个“for”循环中它需要 4 个值而不是 3 个?

#include<stdio.h>
void main()
{
    int marks[3];
    int i;

    for(i=0;i<3;i++)
    {
        printf("Enter a no\n");
        scanf("%d\n",(marks+i));
    }
    for(i=0;i<3;i++)
    {
        printf("%d\n",*(marks+i));
    }
}

【问题讨论】:

  • void main 不合法。使用int main

标签: c arrays


【解决方案1】:

scanf 中的\n 是问题

#include<stdio.h>
int main()
{
    int marks[3];
    int i;

    for(i=0;i<3;i++)
    {
        printf("Enter a no\n");
        scanf("%d",(marks+i));
    }

    printf("\nEntered values:\n");
    for(i=0;i<3;i++)
    {
        printf("%d\n",*(marks+i));
    }

    return 0;
}

原因:

我希望只有 3 值存储在数组中,但它存储 4 个值 并在下一个“for”循环中按预期显示 3 个值。我的问题是为什么 在第一个“for”循环中,它需要 4 个值而不是 3 个?

第一:不,它只在数组marks[] 中存储3 数字而不是4 数字。

第二次:有趣的是,i = 0i &lt; 3 的循环只运行了 3 次。 for 循环根据条件运行。更有趣的代码卡在scanf(),如下所述:

您的困惑是为什么您必须输入四个数字,这不是因为您循环运行 4 次,而是因为 scanf() 函数仅在您输入非空格字符时返回(并且经过一些 enter 按你输入一个非空格字符的数字符号)。

要了解这种行为,请阅读手册:int scanf(const char *format, ...);

一系列空白字符(空格、制表符、换行符等;参见 isspace(3))。该指令 匹配任意数量的空白, 包括无,在输入中

因为在第一个 for 循环中,在 scanf() 中,您已将 \n 包含在格式字符串中,因此 scanf() 仅在按数字 enter (或非空格 )。

 scanf("%d\n",(marks+i));
           ^
           |
            new line char 

会发生什么?

假设程序的输入是:

23        <--- because of %d 23 stored in marks[0] as i = 0
<enter>   <--- scanf consumes \n, still in first loop
543       <--- scanf returns, and leave 542 unread, 
                               then in next iteration 543 read by scanf in next iteration
<enter> 
193
<enter>  <--- scanf consumes \n, still in 3rd loop
<enter>  <--- scanf consumes \n, still in 3rd loop
123      <--- remain unread in input stream 

【讨论】:

  • thanx DX 但是当我在 scanf 中的 %d 之后使用 \n 时,当 i 的值为 0 时第一次需要 2 个值,但当 i 的值变为 1 和 2 时只需要 1,为什么这样发生了什么?
  • 请通过这个answers.yahoo.com/question/index?qid=20110801122000AA07FO8希望这能给你确切的原因
  • @GrijeshChauhan 肯定对所有人都有帮助:) 请这样做
  • Parameters**/ 中的 int scanf ( const char * format, ... ); 读取,如果格式字符串是 *空白字符: 它会返回 *A single whitespace in the format string validates any quantity of whitespace characters extracted from the stream (including none). 所以当 @ ranaarjun 在 scanf 中使用\n,即使在输入最后一个数字之后,它也总是等待读取\n,并且因为\n 可以消耗任意数量的\n,正如我引用的那样,直到 OP 不要' t 输入一个非 while 字符(他实际上输入了数字) scanf 不要离开输入流的读取
  • @SanyamGoel 不客气 :)
【解决方案2】:

删除\ni可以在if语句中创建为for (int i = 0; i &lt; 3; i++) {}

【讨论】:

    猜你喜欢
    • 2012-01-03
    • 2011-11-16
    • 1970-01-01
    • 2015-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-01
    相关资源
    最近更新 更多