【问题标题】:My Unknown Numbers of Input Code Duplicates the Last Input我未知数量的输入代码重复了最后一个输入
【发布时间】:2020-03-27 23:09:33
【问题描述】:

我正在完成我的一项 C 作业。我在接受未知数量的输入时遇到了一点问题。这是我的代码:

    while ((a = getchar()) != EOF){
        ungetc(a,stdin);
        scanf(" %c %d %d %d",&a,&b,&c,&d);
        arr1[3*i] = b;
        arr1[3*i+1] = c;
        arr1[3*i+2] = d;
        i++;

(我已经完成了所有的声明)

我在这里尝试做的是我接受输入并将它们存储在三个数组中。我的意见是:

X 10 18 3

r -3 2 1

Y 0 -2 -1

在终端中写完这些后,我必须按两次 ctrl+d 按钮。然后当我尝试检查 arr1 时,它就像 {10, 18, 3, -3 ,2 ,1 ,0 ,-2 ,-1 ,0 ,-2 ,-1} 最后一个输入是重复的,我没有不知道是什么原因。。

!!!主要的是我不知道我会接受多少输入。 !!!

感谢您的帮助。

【问题讨论】:

  • while (scanf(" %c%d%d%d",&a,&b,&c,&d) == 4) 是写循环的正常方式。

标签: c input while-loop


【解决方案1】:

在每个 scanf 之后,文件指针留在输入的尾随换行符上。在扫描输入的最后一行并将值分配给 b、c 和 d 之后,while 循环中的getchar 读取最后的换行符。然后 scanf 不读取任何值,因此 b、c 和 d 不变。将前一个循环留下的值分配给数组,i 递增,然后 getchar 返回 EOF,循环中断。始终检查 scanf 返回的值。换句话说,如果你使用通常的习语,这个问题就会消失

while(scanf(" %c%d%d%d",&a,&b,&c,&d) == 4) { ...

此外,在这种情况下,如果您没有将数据不必要地复制到临时变量 b、c 和 d 中,则错误会更容易被发现,而是这样做了:

while( scanf(" %c%d%d%d", &a, arr + 3*i, arr + 3*i +1, arr + 3*i + 2) == 4 

这样写会更干净:

int *base = arr;
while( scanf(" %c%d%d%d", &a, base, base + 1, base + 2) == 4 ) {
    base += 3; ...

请注意,在所有这些中,a 必须真正声明为 char,但从 getchar 分配 a 要求 aint,这应该是尝试使用getchar/ungetc 是错误的。

总而言之,除了第一行输入之外,getchar 正在读取 '\n',ungetc 将该换行符推回缓冲区,然后 scanf 跳过它,因为格式字符串。

【讨论】:

    【解决方案2】:

    关于:

    while ((a = getchar()) != EOF){
        ungetc(a,stdin);
        scanf(" %c %d %d %d",&a,&b,&c,&d);
        arr1[3*i] = b;
        arr1[3*i+1] = c;
        arr1[3*i+2] = d;
        i++;
    

    建议使用scanf()的返回值,类似:

    int i = 0;
    while ( scanf(" %c %d %d %d",&a,&b,&c,&d) == 4 )
    {
        arr1[3*i] = b;
        arr1[3*i+1] = c;
        arr1[3*i+2] = d;
        i++;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-04
      • 1970-01-01
      • 1970-01-01
      • 2016-03-11
      • 1970-01-01
      • 1970-01-01
      • 2018-02-02
      相关资源
      最近更新 更多