C for循环迭代

时间:2013-09-18 10:47:48

标签: c struct

编写执行以下操作的代码时遇到问题:声明struct{char c; int x; }数组并通过循环使用scanf加载它。在加载之后,将调用函数f,它将用0替换struct的组件c中的每个数字,并返回由零替换的数字之和。

代码和输出在下面,我有问题,函数f中的循环似乎迭代了一次,并且它给出了一些非常奇怪的值。

这是一个考试问题,所以我必须使用printfscanf等。此外,我在一小时内参加考试,因此欢迎任何快速帮助:)

CODE:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

#define MAX 2

struct par {
    char c;
    int x;
};

int f(struct par *niz) {
    int i;
    int n=0;
    for(i=0; i<MAX; i++) {
        if(isdigit(niz[i].c)) {
            niz[i].c = niz[i].c-'0';
            printf("niz[i].c = %d\n i = %d", niz[i].c, i);
            n=n+niz[i].c;
            niz[i].c='0';
        }
    }

    return n;
}

void main() {
    int n;
    int i;

    struct par niz[MAX];

    printf("enter\n");

    for(i=0; i<MAX; i++) {
        scanf("%c", &niz[i].c);
        scanf("%d", &niz[i].x);
    }

    n=f(niz);

    for(int i=0; i<MAX; i++) {
        printf("%d\n", niz[i].c);
        printf("%d\n", niz[i].x);
    }
    printf("n = %d\n", n);
}

输出:

enter
2
2
2
niz[i].c = 2
 i = 048
2
10
2
n = 2

4 个答案:

答案 0 :(得分:2)

在第一次输入后按Enter键时,scanf不会扫描换行符并保留在输入缓冲区中。当您尝试读取数字scanf时,会看到换行符而不是数字,因此不扫描任何内容。

简单的解决方案是在格式前面添加一个前导空格:

scanf(" %c", &niz[i].c);
scanf(" %d", &niz[i].x);
/*     ^ */

这告诉scanf跳过空格。

答案 1 :(得分:1)

使用

niz[i].c = getchar();

而不是

scanf("%c", &niz[i].c);

或者,您可以使用其他更好的方法来获取在SO中讨论的char输入,

现在,
您第二次看到提供的输入只有一次,这是因为在将2作为第一个char的输入后,您按下的 Enter 保留在输入缓冲区中,并且在第二次读取时迭代。

您输出10,因为它是\r的ASCII,输入。 不是数字,因此不能替换为'0'

答案 2 :(得分:1)

我正在看你的代码(我十年来没有使用控制台,但是)这里有一些见解:

  1. 尝试使用其他内容重命名 MAX
    • 不了解您的IDE,但有时 MAX 已保留
    • 并将其用作宏可能会导致某些编译器出现问题
  2. scanf(“%c”,&amp; niz [i] .c)更改为 scanf(“%c”,&amp;(niz [i] .c))< /强>
    • 只是支持将正确的广告发送到scanf
  3. scanf(“%d”,&amp; niz [i] .x)更改为 scanf(“%i”,&amp;(niz [i] .x))< /强>
  4. “%d”更改为正确的值(这是您的主要问题
    • “%c”代表char
    • “%i”for int
  5. 尝试逐行追踪,如果以上几点无效,请注意不正确的变量变化

答案 3 :(得分:1)

奇怪的价值观? 因为你在行之后忘了“\ n”,所以下一行打印在“i =%d”行后面。 并且,检查除了返回void的函数之外的每个函数的返回值。