C for 循环迭代

标签 c struct

我在编写执行以下操作的代码时遇到问题:声明一个 struct{char c;整数x; } 数组并通过循环使用 scanf 加载它。加载后,将调用函数 f ,该函数会将结构体组件 c 中出现的每个数字替换为 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

最佳答案

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

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

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

这告诉 scanf 跳过空格。

关于C for 循环迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18870176/

相关文章:

c# - OOP - 从子函数更新整个对象,如 C 中的指针

c - 使用 fscanf() 使用 feof()

c - 如何从 c 中的指针设置结构成员

c - C 中的链表、结构的结构、段错误

c - RecursiveFree 函数 - 警告 : initialization from incompatible pointer type [-Wincompatible-pointer-types]

c - 如何导致sqlite3_initialize失败

c - 与 C 信号的简单同步

c++ - 将光标位置存储在类对象中(ncurses c++)

arrays - 使用Hive在数组中创建结构

c - 当我尝试编译 C 代码时,为什么会出现这些错误?