2

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

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

这是一个考试问题,所以我必须使用printfscanf等等。我还有一个小时的考试,所以任何快速帮助表示赞赏:)

代码:

#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

4 回答 4

2

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

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

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

这告诉scanf跳过空格。

于 2013-09-18T10:55:22.423 回答
1

利用

niz[i].c = getchar();

代替

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

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

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

您将得到10输出,因为它是 ASCII\r的 Enter。它不是一个数字,所以没有被替换'0'

于 2013-09-18T10:56:56.827 回答
1

weird values? because you forgot "\n" after the line, so next print is behind the line "i = %d". And, check return value of every function except ones that return void.

于 2013-09-18T11:15:16.020 回答
1

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

  1. 尝试用其他东西 重命名MAX
    • 不知道你的 IDE 但有时MAX是保留的
    • 并将其用作宏可能会导致某些编译器出现问题
  2. scanf("%c", &niz[i].c)更改为 scanf("%c", &(niz[i].c))
    • 只是为了支持将正确的地址发送到 scanf
  3. scanf("%d", &niz[i].x)更改为scanf("%i", &(niz[i].x))
  4. “%d”更改为正确的值(这是您的主要问题
    • 字符的“%c”
    • "%i" 表示 int

如果以上几点没有帮助,请尝试逐行跟踪并注意不正确的变量变化

于 2013-09-18T11:03:59.580 回答