我在编写执行以下操作的代码时遇到问题:声明一个 struct{char c;整数x; }
数组并通过循环使用 scanf
加载它。加载后,将调用函数 f
,该函数会将结构体组件 c
中出现的每个数字替换为 0,并返回替换数字的总和为零。
代码和输出如下,我遇到的问题是函数 f
中的循环似乎迭代了一次,并且给出了一些非常奇怪的值。
这是一道考试题,所以我必须使用 printf
、scanf
等。另外,我在一小时内进行了考试,因此非常感谢您的快速帮助:)
代码:
#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/